Wat doet een #if 0 ….. #endif blok precies?

In C/C++

Wat gebeurt er met code die tussen een #if 0/#endif-blok wordt geplaatst?

#if 0
//Code goes here
#endif

Wordt de code gewoon overgeslagen en daarom niet uitgevoerd?


Antwoord 1, autoriteit 100%

Het wordt niet alleen niet uitgevoerd, het wordt zelfs niet gecompileerd.

#ifis een preprocessor-opdracht, die wordt geëvalueerd vóór de eigenlijke compilatiestap. De code in dat blok verschijnt niet in het gecompileerde binaire bestand.

Het wordt vaak gebruikt voor het tijdelijk verwijderen van codesegmenten met de bedoeling ze later weer in te schakelen.


Antwoord 2, autoriteit 52%

Het is hetzelfde als commentaar geven op het blok, behalve met één belangrijk verschil: nesten is geen probleem. Overweeg deze code:

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

Als ik er commentaar op wil geven, kan ik het proberen:

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

Bzzt. Syntax error! Waarom? Omdat blokopmerkingen niet nesten, en dus (zoals je kunt zien aan de syntaxisaccentuering van SO) beëindigt de */na het woord “NULL” de opmerking, waardoor de baz-aanroep niet uitgecommentarieerd, en de */na bazeen syntaxisfout. Aan de andere kant:

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

Werkt om het hele ding te becommentariëren. En de #if 0en zullen met elkaar nesten, zoals zo:

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

Hoewel dit natuurlijk een beetje verwarrend kan zijn en een onderhoudsprobleem kan worden als het niet goed wordt becommentarieerd.


Antwoord 3, autoriteit 11%

Het geeft permanent commentaar op die code, zodat de compiler deze nooit zal compileren.

De codeur kan later de #ifdef wijzigen om die code in het programma te laten compileren als hij dat wil.

Het is precies alsof de code niet bestaat.


Antwoord 4, autoriteit 8%

Ik wil graag iets toevoegen voor de #elsecase:

#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

Antwoord 5, autoriteit 5%

Als de preprocessor #if ziet, controleert hij of het volgende token een waarde heeft die niet nul is. Als dit het geval is, houdt het de code voor de compiler. Als dat niet het geval is, verwijdert het die code, zodat de compiler het nooit ziet.

Als iemand #if 0 zegt, geven ze in feite commentaar op de code, zodat deze nooit wordt gecompileerd. Je kunt dit op dezelfde manier zien alsof ze /* … */ eromheen hadden gezet. Het is niet helemaal hetzelfde, maar het heeft hetzelfde effect.

Als je tot in detail wilt begrijpen wat er is gebeurd, kun je vaak kijken. Bij veel compilers kunt u de bestanden zien nadat de preprocessor is uitgevoerd. Op Visual C++ zal de opdracht switch /P bijvoorbeeld de preprocessor uitvoeren en de resultaten in een .i-bestand plaatsen.

Other episodes