117 votes

Que fait exactement un bloc #if 0 ..... #endif ?

En C/C++

Qu'arrive-t-il au code placé entre un bloc #if 0/#endif ?

#if 0

//Code goes here

#endif

Est-ce que le code est simplement ignoré et n'est donc pas exécuté ?

134voto

David Points 3766

Non seulement il n'est pas exécuté, mais il n'est même pas compilé.

#if est une commande du préprocesseur, qui est évaluée avant l'étape de compilation proprement dite. Le code contenu dans ce bloc n'apparaît pas dans le binaire compilé.

Il est souvent utilisé pour supprimer temporairement des segments de code dans l'intention de les réactiver plus tard.

70voto

Tyler McHenry Points 35551

C'est identique à la mise en commentaire du bloc, à une différence près : 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 peux essayer :

/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/

Bzzt. Erreur de syntaxe ! Pourquoi ? Parce que les commentaires de bloc ne s'emboîtent pas, et donc (comme vous pouvez le voir dans la coloration syntaxique de SO) la balise */ après le mot "NULL" termine le commentaire, ce qui rend le baz non commenté, et l'appel */ après baz une erreur de syntaxe. D'autre part :

#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif

Travaille pour commenter l'ensemble. Et le #if 0 vont s'imbriquer les uns dans les autres, 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 être un peu confus et devenir un casse-tête de maintenance si ce n'est pas commenté correctement.

17voto

Nilbert Points 507

Il commente ce code de façon permanente afin que le compilateur ne le compile jamais.

Le codeur peut ensuite modifier le #ifdef pour que ce code compile dans le programme s'il le souhaite.

C'est exactement comme si le code n'existait pas.

14voto

Jörg W Mittag Points 153275

Que fait exactement un bloc #if 0 #endif ?

Cela vous indique que l'auteur n'a manifestement jamais entendu parler d'un système de contrôle de version. Ce qui, à son tour, vous dit de fuir aussi loin que possible

7voto

Steve Rowe Points 14688

Lorsque le préprocesseur voit #if, il vérifie si le jeton suivant a une valeur non nulle. 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 pour que le compilateur ne le voie jamais.

Si quelqu'un dit #if 0, il commente effectivement le code afin qu'il ne soit jamais compilé. Vous pouvez penser que c'est la même chose que s'il avait mis /* ... */ autour. 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 après l'exécution du préprocesseur. Par exemple, avec Visual C++, la commande switch /P exécutera le préprocesseur et placera les résultats dans un fichier .i.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X