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é?
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é?
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.
C'est identique à commenter le bloc, sauf avec une différence importante: l'imbrication n'est pas un problème. Considérez ce code:
foo();
bar(x, y); /* x must not be NULL */
baz();
Si je veux le commenter, je pourrais essayer:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
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ès baz
une erreur de syntaxe. D'autre part:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Fonctionne pour commenter le tout. Et les #if 0
s vont s'emboîter, comme ceci:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
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.
foo.c:3: unterminated string or character constant
de gcc, qu'est-ce que vous utilisez?
Que fait exactement un bloc #if 0… #endif?
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 ...
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.
#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
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
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.
Pas assez
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Il affiche "tc: 4: 19: avertissement:" caractère de terminaison manquant "avec gcc 4.2.4
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:
#ifdef DEBUG
// output to file
#endif
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.
//
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.