In C / C ++
Cosa succede al codice inserito tra un blocco #if 0/ #endif?
#if 0
//Code goes here
#endif
Il codice viene semplicemente saltato e quindi non viene eseguito?
In C / C ++
Cosa succede al codice inserito tra un blocco #if 0/ #endif?
#if 0
//Code goes here
#endif
Il codice viene semplicemente saltato e quindi non viene eseguito?
Risposte:
Non solo non viene eseguito, ma non viene nemmeno compilato.
#ifè un comando del preprocessore, che viene valutato prima dell'effettiva fase di compilazione. Il codice all'interno di quel blocco non appare nel binario compilato.
Viene spesso utilizzato per rimuovere temporaneamente segmenti di codice con l'intenzione di riattivarli in seguito.
È identico a commentare il blocco, tranne con una differenza importante: l'annidamento non è un problema. Considera questo codice:
foo();
bar(x, y); /* x must not be NULL */
baz();
Se voglio commentarlo, potrei provare:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt. Errore di sintassi! Perché? Poiché i commenti di blocco non si annidano e quindi (come si può vedere dall'evidenziazione della sintassi di SO) il */dopo la parola "NULL" termina il commento, rendendo la bazchiamata non commentata e il */dopo bazun errore di sintassi. D'altro canto:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Funziona per commentare l'intera cosa. E le #if 0s si annideranno l'una con l'altra, in questo modo:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Anche se ovviamente questo può creare un po 'di confusione e diventare un problema di manutenzione se non commentato correttamente.
foo.c:3: unterminated string or character constantda gcc, cosa stai usando?
Cosa fa esattamente un blocco #if 0… #endif?
Ti dice che l'autore ovviamente non ha mai sentito parlare di un sistema di controllo delle versioni. Il che, a sua volta, ti dice di scappare il più lontano possibile ...
Quando il preprocessore vede #if controlla se il token successivo ha un valore diverso da zero. Se lo fa, mantiene il codice in giro per il compilatore. In caso contrario, si elimina quel codice in modo che il compilatore non lo veda mai.
Se qualcuno dice #if 0 sta effettivamente commentando il codice in modo che non venga mai compilato. Puoi pensare a questo come se avessero messo / * ... * / attorno ad esso. Non è proprio la stessa cosa, ma ha lo stesso effetto.
Se vuoi capire cosa è successo in dettaglio, puoi spesso guardare. Molti compilatori ti permetteranno di vedere i file dopo che il preprocessore è stato eseguito. Ad esempio, in Visual C ++ il comando switch / P eseguirà il preprocessore e inserirà i risultati in un file .i.
#if WIN32 || __CYGWIN__Ma funziona come previsto.
Le righe che iniziano con a #sono direttive del preprocessore . #if 0 [...] #endifi blocchi non arrivano al compilatore e non genereranno codice macchina.
Puoi dimostrare cosa succede con il preprocessore con un file sorgente ifdef.cxx:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
L'esecuzione gcc -E ifdef.cxxti mostrerà cosa viene compilato.
Puoi scegliere di utilizzare questo meccanismo per impedire che un blocco di codice venga compilato durante il ciclo di sviluppo, ma probabilmente non vorrai archiviarlo nel tuo controllo del codice sorgente poiché aggiunge semplicemente cruft al tuo codice e riduce la leggibilità. Se è un pezzo storico di codice che è stato commentato, allora dovrebbe essere rimosso: il controllo del codice sorgente contiene la cronologia, giusto?
Inoltre, la risposta potrebbe essere la stessa sia per C che per C ++ ma non esiste un linguaggio chiamato C / C ++ e non è una buona abitudine fare riferimento a tale linguaggio.
Non proprio
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Mostra "tc: 4: 19: warning: carattere di terminazione mancante" con gcc 4.2.4
È un modo economico per commentare, ma sospetto che possa avere un potenziale di debug. Ad esempio, supponiamo di avere una build che restituisce valori in un file. Potresti non volerlo in una versione finale, quindi puoi usare #if 0 ... #endif.
Inoltre, sospetto che un modo migliore per farlo a scopo di debug sarebbe quello di fare:
#ifdef DEBUG
// output to file
#endif
Puoi fare qualcosa del genere e potrebbe avere più senso e tutto ciò che devi fare è definire DEBUG per vedere i risultati.
//o iniziare la sezione con/*e terminare la sezione con*/. Il problema con le ultime tecniche è che i commenti non si annidano, quindi lo sviluppatore deve controllare e gestire qualsiasi*/tra l'inizio e la fine.