2010-03-24 22 views
5

Ho il seguente frammento di codice:C++ compilazione condizionale

#ifdef DO_LOG 
#define log(p) record(p) 
#else 
#define log(p) 
#endif 

void record(char *data){ 
..... 
..... 
} 

Ora, se io chiamo log("hello world") nel mio codice e DO_LOG non è definito, sarà la linea di essere compilati, in altre parole si è mangiare la memoria per la stringa "ciao mondo"?

P.S. Ci sono molte chiamate record nel programma ed è sensibile alla memoria, quindi esiste un altro modo per compilare condizionatamente in modo che dipenda solo dallo #define DO_LOG?

+2

Non è necessario implementare la propria libreria di registrazione. Ce ne sono abbastanza là fuori. Ecco cosa sto usando: http://www.templog.org. – sbi

+2

@sbi non lo so. Ho scritto il mio e funziona magnificamente. È il modo migliore per imparare come fare qualcosa. :-) – Konrad

+1

@Konrad: L'ho fatto anche io, ma è difficile essere migliori della saggezza accumulata da una biblioteca consolidata. – sbi

risposta

14

Questo dovrebbe essere banale per verificare di persona ispezionando il binario risultante.

vorrei dire "no", dal momento che l'espressione va totalmente lontano, il compilatore non vedrà mai la stringa (è rimosso dalla macro di espansione del preprocessore).

+1

Questo è corretto. E scrivere un programma per verificare ci sono voluti 30 secondi. –

+2

@unwind & @Neil: sarei interessato a come hai verificato che il comportamento osservato non è solo una particolarità del tuo compilatore. – sbi

+0

@sbi: Non l'ho fatto, lo ammetto volentieri. Penso che la logica che uso nella mia risposta sia sana; la macro del preprocessore deve funzionare come definito, cioè la stringa letterale scompare dalla sorgente. Sentiti libero di citare gli standard se è sbagliato, sarei felice di sapere. – unwind

4

Dal momento che il preprocessore viene eseguito prima il compilatore, la linea sarà nemmeno esistere quando il compilatore viene eseguito. Quindi la risposta è no, non usa affatto memoria.

4

No, non sarà nel binario. Non verrà nemmeno compilato - il preprocessore lo espanderà in una stringa vuota prima della compilazione, quindi il compilatore non lo vedrà nemmeno.

2

No. Il preprocessore viene eseguita prima della compilazione, e quindi il codice verrà mai essere visto. Vorrei aggiungere, tuttavia, che se sei interessato ad aggiungere la registrazione alla tua applicazione C++, potresti voler usare la libreria Log4Cxx. Utilizza macro simili che è possibile eliminare completamente dall'applicazione, ma quando la registrazione è abilitata, supporta diversi livelli di registrazione (in base all'importanza/gravità) e diversi "appendici" a cui inviare l'output di registrazione (ad es. Syslog , console, file, I/O di rete, ecc.).

La documentazione completa API possono essere trovate a Log4Cxx API docs. Inoltre, se a bordo ci sono sviluppatori Java che hanno utilizzato Log4J, dovrebbero sentirsi a casa con Log4Cxx (e convincere di usarlo).

Problemi correlati