web-dev-qa-db-fra.com

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

Dans C /C++

Qu'advient-il du code placé entre un #if 0/#endif bloc?

#if 0

//Code goes here

#endif

Le code est-il simplement ignoré et par conséquent non exécuté?

115
vette982

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 avec l'intention de les réactiver plus tard.

132
David

C'est identique à commenter le bloc, sauf avec une différence importante: l'imbrication n'est pas un problème. Considérons ce code:

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

Si je veux 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 donc (comme vous pouvez le voir avec la coloration syntaxique de SO), le */ après le mot "NULL" termine le commentaire, rendant l'appel baz non mis en commentaire et le */ après baz une erreur de syntaxe. D'autre part:

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

Travaille à commenter le tout. Et le #if 0s vont s'emboîter 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 devenir un peu déroutant et devenir un casse-tête de maintenance s’il n’est pas commenté correctement.

66
Tyler McHenry

Il commente ce code en permanence afin que le compilateur ne le compile jamais.

Le codeur peut ensuite changer le #ifdef pour que ce code soit compilé dans le programme s’il le souhaite.

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

17
Nilbert

J'aimerais ajouter pour le #else Cas:

#if 0
   /* Code here will NOT be complied. */
#else
   /* Code will be compiled. */
#endif


#if 1
   /* Code will be complied. */
#else
   /* Code will NOT be compiled. */
#endif
12
Steven Xu

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 fuir le plus loin possible…

12
Jörg W Mittag

Lorsque le préprocesseur voit #si il vérifie si le prochain jeton a une valeur non nulle. Si c'est le cas, il garde 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 voie jamais.

Si quelqu'un dit #si 0, il commente efficacement le code afin 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 pareil, mais ça 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, sous Visual C++, la commande switch/P exécute le préprocesseur et place les résultats dans un fichier .i.

6
Steve Rowe

Lignes commençant par un # sont directives du préprocesseur . #if 0 [...] #endif Les blocs ne se rendent pas au compilateur et ne génèreront aucun code machine.

Vous pouvez dé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

Fonctionnement gcc -E ifdef.cxx va vous montrer ce qui est compilé.

Vous pouvez choisir d'utiliser ce mécanisme pour empêcher la compilation d'un bloc de code pendant le cycle de développement, mais vous ne voudrez probablement pas l'archiver dans votre contrôle de code source, car cela ne ferait que rendre le code cruel et en diminuerait la lisibilité. Si c'est un morceau de code historique qui a été commenté, alors il devrait être supprimé: le contrôle de code source contient l'historique, n'est-ce pas?

En outre, la réponse peut être la même pour les deux [~ # ~] c [~ # ~] et C++ mais il n'y a pas de langage appelé C/C++ et ce n'est pas une bonne habitude de se référer à un tel langage.

3
Johnsyweb

Pas assez

int main(void)
{
   #if 0
     the apostrophe ' causes a warning
   #endif
   return 0;
}

Cela montre "t.c: 4: 19: warning: 'caractère de fin manquant' avec gcc 4.2.4

1

C'est un moyen peu coûteux de commenter, mais je suppose que cela pourrait avoir un potentiel de débogage. Par exemple, supposons que vous ayez une génération qui stocke les valeurs dans un fichier. Vous ne voudrez peut-être pas cela dans une version finale afin de pouvoir utiliser le #if 0 ... #endif.

De plus, je suspecte 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 peut sembler plus logique et tout ce que vous avez à faire est de définir DEBUG pour voir les résultats.

0
Daniel