2010-03-24 45 views
5

he el siguiente fragmento de código:C++ compilación condicional

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

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

Ahora si llamo log("hello world") en mi código y DO_LOG no está definida, se compilará la línea, es decir va a comer hasta la memoria para la cadena "hola mundo"?

P.S. Hay muchas llamadas de registro en el programa y es sensible a la memoria, entonces ¿hay alguna otra manera de compilar condicionalmente para que solo dependa del #define DO_LOG?

+2

No debe implementar su propia biblioteca de registro. Hay suficientes por ahí. Esto es lo que estoy usando: http://www.templog.org. – sbi

+2

@sbi No lo sé. He escrito el mío y funciona muy bien. Es la mejor manera de aprender a hacer algo. :-) – Konrad

+1

@Konrad: Yo también lo hice, pero es difícil ser mejor que la sabiduría acumulada de una biblioteca establecida. – sbi

Respuesta

14

Esto debería ser trivial para verificarlo usted mismo inspeccionando el binario resultante.

Yo diría que "no", ya que la expresión desaparece por completo, el compilador nunca verá la cadena (es eliminada por la expansión de macros del preprocesador).

+1

Esto es correcto. Y escribir un programa para verificar que me tomó todos los 30 segundos. –

+2

@unwind & @Neil: Me interesaría cómo ha verificado que el comportamiento observado no es solo una peculiaridad de su compilador. – sbi

+0

@sbi: No lo hice, lo admitiré gustosamente. Creo que la lógica que uso en mi respuesta es sólida; la macro del preprocesador debe funcionar como se definió, es decir, la cadena literal desaparece de la fuente. Siéntase libre de citar estándares si eso está mal, me gustaría saberlo. – unwind

4

Como el preprocesador se ejecuta antes del compilador, la línea ni siquiera existirá cuando se ejecute el compilador. Entonces la respuesta es no, no usa memoria en absoluto.

4

No, no estará en el binario. Ni siquiera se compilará: el preprocesador lo expandirá en una cadena vacía antes de la compilación, por lo que el compilador ni siquiera lo verá.

2

No. El preprocesador se ejecuta antes de la compilación, por lo que el código nunca se verá. Me gustaría agregar, sin embargo, que si está interesado en agregar el registro a su aplicación C++, es posible que desee utilizar la biblioteca Log4Cxx. Utiliza macros similares que puede eludir completamente de su aplicación, pero cuando el registro está habilitado, admite varios niveles diferentes de registro (según la importancia/gravedad) así como múltiples "apéndices" diferentes a los que enviar salida de registro (por ejemplo, syslog , consola, archivos, E/S de red, etc.).

La documentación completa de la API se puede encontrar en Log4Cxx API docs. Además, si tienes a algún desarrollador de Java a bordo que haya usado Log4J, deberían sentirse como en casa con Log4Cxx (y convencerlo de que lo uses).

Cuestiones relacionadas