Ce qui est statique bloc en c ou c++?
Je veux savoir que ce qui est statique bloc en c ou c++ avec un exemple? Je sais ce qui est statique, mais quelle est la différence entre statique et statique bloc?
Il n'y a pas une telle chose, dans les deux langues.
vérifiez vos en-têtes d'un #define bloc .... peut-être que quelqu'un a défini "bloc"...
J'ai été d'explorer "statique" concept par le biais du moteur de recherche google et quand j'ai tapé "statique bloc" à la google , j'ai trouvé une option stipulant que "bloc statique en c"
Et qui prouve que ... quoi?
Un bloc statique a été introduit dans Java et existe aussi en C# et est utilisé pour initialiser les membres statiques.
vérifiez vos en-têtes d'un #define bloc .... peut-être que quelqu'un a défini "bloc"...
J'ai été d'explorer "statique" concept par le biais du moteur de recherche google et quand j'ai tapé "statique bloc" à la google , j'ai trouvé une option stipulant que "bloc statique en c"
Et qui prouve que ... quoi?
Un bloc statique a été introduit dans Java et existe aussi en C# et est utilisé pour initialiser les membres statiques.
OriginalL'auteur Abhineet | 2010-07-30
Vous devez vous connecter pour publier un commentaire.
Une autre alternative est que vous pourriez être à la recherche de l'analogie de la statique
bloc en Java. Un bloc de code qui est exécuté lorsque l'application est chargée.
Il n'y a pas une telle chose en C++, mais il peut être faux en utilisant le constructeur de l'
objet statique.
CEPENDANT. J'ai été mordu par cette avant comme c'est un subtil cas limite de la C++
standard. Si la statique de l'objet n'est pas accessible par le code appelé par le principal
constructeur de l'objet statique peut ou ne peut pas être appelé.
J'ai trouvé qu'avec gcc bonjour obtiendrez de sortie et avec visual studio, il va
pas.
+1 pour la mention de l'éventuel non-accessible de cas. Êtes-vous sûr que ce n'est pas d'être appelé et pas juste d'être retirée au moment de la compilation? Je soupçonne même gcc cela avec suffisamment d'options d'optimisation.
Non, vous pouvez être assuré qu'il n'est pas supprimé. bradgonesurfing: Pourquoi s'embêter à l'aide d'une classe? N'est-il pas suffisant de simplement les static-initialiser un int avec une fonction?
OriginalL'auteur
J'ai trouvé cette réponse sur Le Projet de Code. Elle implique d'avoir un supplément variable statique, mais je crois qu'il est plus fiable que bradgonesurfing de réponse. En gros, c'est: est-ce
Cela signifie également que, à l'instar de Java blocs statiques, vous n'êtes pas obligé jamais capable d'avoir une instance de
class Foo
, ce qui est utile lorsque la classe peut prendre beaucoup de données, et vous avez simplement besoin de automagiquement appeler quelque chose avant qu'il charge, de ne pas instancier un supplément instance. Vous pouvez test exact de bloc de code. J'ai juste compilé (avec un peu de sortie de static_init(), et avait une main() print Foo::__st_init, afin d'être sûr), et il a très bien fonctionné.EDIT:
Désolé que cela est si tard, mais j'ai testé ce que bradgonesurfing mentionné:
J'ai utilisé la commande suivante à l'intérieur main.cpp:
J'ai compilé avec
g++ ./main.cpp -o main
et il a couru et on a reçu un chaleureux "Bonjour, Monde!" message sur ma console. Juste pour être complet, j'ai également réalisé la même version, mais sans l'impression et compilé avecg++ ./main.cpp -g -o main
. J'ai ensuite couru le fichier exécutable avec gdb et a le résultat suivant:Voici une version plus récente de sortie pour g++:
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
C'est un grand point, bradgonesurfing. J'ai mis à jour ma réponse avec suffisamment de tests et il semble fonctionner de toute façon. Désolé d'être deux ans de retard, si jamais tu lis ça... je ne sais pas pourquoi je n'ai jamais répondu.
Merci pour une approche qui fonctionne dans certains cas, mais, malheureusement, cela ne fonctionne pas si vous appelez la méthode statique dans, disons, une bibliothèque statique... Même si vous incluez le Foo-tête dans votre main.cpp.
Caleb445: Ne pensez-vous pas que c'est le genre de beaucoup de tracas? Je veux dire, même avec cette approche, vous pourrait/devrait macroify de sorte qu'il est moins verbeux à utiliser.
OriginalL'auteur
Il n'y a pas de concept avec le nom "statique bloc" en C/C++. Java a cependant un "bloc statique" est un initialiseur bloc de code pour une classe qui fonctionne exactement une fois, avant la première instance d'une classe est créée. Le concept de base de "trucs qui fonctionne exactement une fois" peut simulé en C/C++ avec une variable statique, par exemple:
Ce n'est pas thread-safe cependant. L'obtention de ce droit, en présence de plusieurs threads peuvent être difficile et difficile parfois.
OriginalL'auteur
Tout en en effet, le C++ n'a pas de blocs statiques dans le cadre de la langue, vous peut mettre en œuvre des blocs statiques sans vous (en tant qu'utilisateur) d'avoir à utiliser toutes les classes ou les espaces de noms, et peut écrire:
ou tout ce que vous voulez. Vous ne pouvez pas avoir de ceux dans les classes, si, juste à portée de fichier. Voir la description détaillée de celles-ci dans ma réponse à une question connexe, et le code de
static_block.h
ici.Remarque: Cela ne nécessite pas de C++11 et va bien travailler avec de vieux compilateurs.
En fait, ce mécanisme n'a rien à voir avec le C++11, c'est C++98 et peut-être même plus tôt. Ne pas utiliser d'initialiseur des listes, des classes, rien de fantaisie - juste un peu de préprocesseur les builtins pour un identifiant unique, et le fait que C++ a une initialisation statique. De toute façon, j'ai inclus un
#include
déclaration et un lien vers le code.Oups, j'ai lu la mauvaise réponse. Oui, il n'y a pas de fantaisie-ness passe sur votre solution. Vous avez raison. Bien que, le C++11 lambdas solution ci-dessus le vôtre a l'air plutôt sympa. Il peut être utilisé à l'intérieur d'une portée de fonction (même si personnellement je ne l'ai pas testé). Votre solution est procédurale et serait même travail en C89, je pense, haha.
Non, ça ne marcherait pas en C89, parce que le C ne permet pas pour l'initialisation statique (donc "statique init fiasco" n'est pas un problème dans le monde C). J'ai également aimé le lambda-fondé de la solution, mais je n'ai pas aimé ce que vous aviez à l'ajout d'une
;
après les accolades. Puis à un moment j'ai réalisé que nous n'avons pas réellement besoin de toutes ces fonctionnalités sophistiquées.OriginalL'auteur
En C++ il y a le concept d'un anonyme de l'espace de noms.
pour obtenir le même effet en C
En termes simples, le compilateur ne pas exporter les symboles de
les unités de traduction quand ils sont déclarées statiques ou
dans un espace de noms anonymes.
x
ety
de la anonyme de l'espace de noms ont une liaison externe tandis que les deux autres ont une liaison interne. Mais je comprends ce que vous voulez dire. Vous signifiait que d'autres unités de traduction ne peut pas se référer à ces variables par leur nom.Les éléments en anonyme espaces de noms une liaison interne. publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/... eh bien, c'est ce que dit IBM. Quelqu'un aurait-il un pointeur vers la norme C++?
Ok. J'ai retrouvé une copie de la norme et il est dit ce qui suit. "Bien que les entités en une sans nom d'espace de noms peut avoir une liaison externe, ils sont qualifiés par un nom unique à chaque unité de traduction" je soupçonne que, dans la pratique, il sera compilateur dépendante, mais l'effet est le même.
OriginalL'auteur