Ce que fait exactement un #if 0 ... #endif bloc faire?
Dans C/C++
Ce qui se passe pour le code placé entre un #if 0
/#endif
bloc?
#if 0
//Code goes here
#endif
Le code obtenez tout simplement ignoré et n'a donc pas été exécuté?
- C'est une technique utilisée pour commentaire-de grandes quantités de code ou pour permettre de tester l'inclusion de blocs de code. Sans cette fonctionnalité, il faut avoir soit un préfixe à chaque ligne avec
//
ou commencer la section avec/*
et à la fin de la section avec*/
. Le problème avec les dernières techniques est que le commentaire ne fait pas de nid de sorte que le développeur se doit de vérifier et traiter les*/
entre le début et la fin. - double possible de Pourquoi devrait-on utiliser un si 1 c directive de préprocesseur
Vous devez vous connecter pour publier un commentaire.
Non seulement il n'est pas exécuté, il n'a même pas compilé.
#if
est une commande du préprocesseur, qui est évaluée avant l'étape de compilation. Le code à l'intérieur de ce bloc n'apparaît pas dans le binaire compilé.Il est souvent utilisé pour supprimer temporairement les segments de code avec l'intention de retourner sur le tard.
Elle est identique à commenter le bloc, sauf avec une différence importante: l'Imbrication n'est pas un problème. Considérer ce code:
Si je veux la mettre en commentaire, je pourrais essayer:
Bzzt. Erreur de syntaxe! Pourquoi? Parce que bloquer les commentaires ne font pas de nid, et donc (comme vous pouvez le voir partir de SI la coloration syntaxique) le
*/
après le mot "NULL" termine le commentaire, faisant de labaz
appel non commentée, et la*/
aprèsbaz
une erreur de syntaxe. Sur l'autre main:Œuvres de commenter la chose entière. Et le
#if 0
s s'imbriquer les uns avec les autres, comme suit:Même si bien sûr, cela peut devenir un peu confus et devenir un mal de tête d'entretien si pas commenté correctement.
foo.c:3: unterminated string or character constant
de gcc, qu'est-ce que vous utilisez?Définitivement les commentaires que le code de sorte que le compilateur ne sera jamais le compiler.
Le codeur peut changer plus tard le #ifdef pour avoir ce code compiler dans le programme s'il le souhaite.
C'est exactement comme le code n'existe pas.
Il vous dit que l'auteur n'a visiblement jamais entendu parler d'un système de contrôle de version. Qui, à son tour, vous dit de courir aussi loin que possible ...
Je tiens à ajouter sur le
#else
cas:Lorsque le préprocesseur voit #si il vérifie si le prochain jeton a une valeur non nulle. Si c'est le cas, il conserve le code pour le compilateur. Si ça ne marche pas, il se débarrasse de ce code de sorte que le compilateur ne la voit jamais.
Si quelqu'un dit: #if 0, ils sont effectivement en commentant le code de sorte qu'il ne sera jamais compilé. Vous pouvez considérer cela comme si ils avaient mis /* ... */autour d'elle. Ce n'est pas tout à fait le même, mais il a le même effet.
Si vous voulez comprendre ce qui s'est passé dans les détails, on peut souvent les voir. De nombreux compilateurs vous permettra de voir les fichiers après le préprocesseur a exécuter. Par exemple, sur Visual C++ le commutateur de commande /P exécutera le préprocesseur et de mettre les résultats dans un .j'fichier.
#if WIN32 || __CYGWIN__
mais cela ne fonctionne pas comme prévu.Les lignes commençant par un
#
sont les directives de préprocesseur.#if 0 [...] #endif
blocs de ne pas le faire pour le compilateur générera pas de code machine.Vous pouvez démontrer ce qui se passe avec le préprocesseur avec un fichier source
ifdef.cxx
:De course
gcc -E ifdef.cxx
va vous montrer ce qui est compilé.Vous pouvez choisir d'utiliser ce mécanisme pour empêcher un bloc de code compilé au cours du cycle de développement, mais vous auriez probablement pas envie de vérifier dans votre contrôle de code source comme il ajoute juste les fichiers inutiles de votre code et réduit la lisibilité. Si c'est une pièce historique de code qui a été commentée, alors il devrait être supprimé: contrôle de code source contient l'histoire, droit?
Aussi, la réponse peut être la même pour les deux C et C++ mais il n'y a pas de langage C/C++ et ce n'est pas une bonne habitude de se référer à un tel langage.
Pas tout à fait
Il montre "t.c:4:19: avertissement: terminaison manquant de caractère"
avec gcc 4.2.4
C'est un moyen pas cher pour commenter, mais je soupçonne qu'il pourrait avoir de débogage potentiel. Par exemple, supposons que vous avez un build que les valeurs de sortie à un fichier. Vous ne voudriez pas que dans la version finale, donc vous pouvez utiliser le #if 0... #endif.
Aussi, je soupçonne une meilleure façon de faire pour déboguer le but serait de faire:
Vous pouvez faire quelque chose comme ça et il pourrait faire plus de sens et tout ce que vous avez à faire est de définir DEBUG pour voir les résultats.