En C / C ++
Qu'arrive-t-il au code placé entre un bloc #if 0
/ #endif
?
#if 0
//Code goes here
#endif
Le code est-il simplement ignoré et n'est donc pas exécuté?
c-preprocessor
vette982
la source
la source
//
soit commencer la section avec/*
et terminer la section avec*/
. Le problème avec ces dernières techniques est que les commentaires ne sont pas imbriqués, le développeur doit donc vérifier et gérer tout*/
entre le début et la fin.Réponses:
Non seulement il n'est pas exécuté, mais il n'est même pas compilé.
#if
est une commande de préprocesseur, qui est évaluée avant l'étape de compilation proprement dite. Le code à l'intérieur de ce bloc n'apparaît pas dans le binaire compilé.Il est souvent utilisé pour supprimer temporairement des segments de code dans le but de les réactiver plus tard.
la source
C'est identique à commenter le bloc, sauf avec une différence importante: l'imbrication n'est pas un problème. Considérez ce code:
Si je veux le commenter, je pourrais essayer:
Bzzt. Erreur de syntaxe! Pourquoi? Parce que les commentaires de bloc ne sont pas imbriqués, et ainsi (comme vous pouvez le voir à partir de la coloration syntaxique de SO),
*/
après le mot «NULL» termine le commentaire, rendant l'baz
appel non commenté et*/
aprèsbaz
une erreur de syntaxe. D'autre part:Fonctionne pour commenter le tout. Et les
#if 0
s vont s'emboîter, comme ceci:Bien sûr, cela peut devenir un peu déroutant et devenir un casse-tête de maintenance s'il n'est pas commenté correctement.
la source
foo.c:3: unterminated string or character constant
de gcc, qu'est-ce que vous utilisez?Il commente en permanence ce code afin que le compilateur ne le compilera jamais.
Le codeur peut plus tard modifier le #ifdef pour que ce code soit compilé dans le programme s'il le souhaite.
C'est exactement comme si le code n'existe pas.
la source
Cela vous indique que l'auteur n'a évidemment jamais entendu parler d'un système de contrôle de version. Ce qui, à son tour, vous dit de courir le plus loin possible ...
la source
Je voudrais ajouter pour le
#else
cas:la source
Lorsque le préprocesseur voit #if, il vérifie si le jeton suivant a une valeur différente de zéro. Si c'est le cas, il conserve le code pour le compilateur. Si ce n'est pas le cas, il se débarrasse de ce code afin que le compilateur ne le voit jamais.
Si quelqu'un dit #if 0, il commente effectivement le code pour qu'il ne soit jamais compilé. Vous pouvez penser à cela de la même manière que s'ils avaient mis / * ... * / autour de lui. Ce n'est pas tout à fait la même chose, mais cela a le même effet.
Si vous voulez comprendre ce qui s'est passé en détail, vous pouvez souvent regarder. De nombreux compilateurs vous permettront de voir les fichiers une fois le préprocesseur exécuté. Par exemple, sur Visual C ++, la commande switch / P exécutera le préprocesseur et placera les résultats dans un fichier .i.
la source
#if WIN32 || __CYGWIN__
mais cela fonctionne comme prévu.Les lignes commençant par un
#
sont des directives de préprocesseur .#if 0 [...] #endif
les blocs ne parviennent pas au compilateur et ne génèrent aucun code machine.Vous pouvez montrer ce qui se passe avec le préprocesseur avec un fichier source
ifdef.cxx
:Running
gcc -E ifdef.cxx
vous montrera ce qui est compilé.Vous pouvez choisir d'utiliser ce mécanisme pour empêcher qu'un bloc de code ne soit compilé pendant le cycle de développement, mais vous ne voudriez probablement pas l'archiver dans votre contrôle de source car il ajoute simplement du cran à votre code et réduit la lisibilité. Si c'est un morceau de code historique qui a été commenté, alors il devrait être supprimé: le contrôle de source contient l'historique, non?
De plus, la réponse peut être la même pour C et C ++, mais il n'y a pas de langage appelé C / C ++ et ce n'est pas une bonne habitude de faire référence à un tel langage.
la source
Pas assez
Il affiche "tc: 4: 19: avertissement:" caractère de terminaison manquant "avec gcc 4.2.4
la source
C'est un moyen peu coûteux de commenter, mais je soupçonne que cela pourrait avoir un potentiel de débogage. Par exemple, supposons que vous ayez une construction qui génère des valeurs dans un fichier. Vous pourriez ne pas vouloir cela dans une version finale afin que vous puissiez utiliser le #if 0 ... #endif.
De plus, je soupçonne qu'une meilleure façon de le faire à des fins de débogage serait de faire:
Vous pouvez faire quelque chose comme ça et cela pourrait avoir plus de sens et tout ce que vous avez à faire est de définir DEBUG pour voir les résultats.
la source