¿Por qué no simplemente define ASSERT
de manera diferente dependiendo de esa macro?
#ifdef MACRO
#define ASSERT(NAME, TEST) \
do { \
printf("Assert failed"); \
} while(0)
#else
#define ASSERT(NAME, TEST) {}
#endif
usando valores fijos del preprocesador en C condicionales deben evitarse - Asegúrese de que el compilador debe optimizar el código muerto, pero ¿por qué confían en que cuando se puede separar esencialmente el código C real?
EDIT:
Hay un lugar fea truco que implica macro argumento stringification que usted puede ser capaz de utilizar:
#include <string.h>
#include <stdio.h>
#define X
#define ERROR_(NAME, TEXT) \
if (strcmp("", #NAME) == 0) \
printf("%s\n", TEXT)
#define ERROR(n, t) ERROR_(n, t)
int main() {
ERROR(X, "Error: X");
ERROR(Y, "Error: Y");
return 0;
}
Este salidas:
$ ./test
Error: X
Esencialmente se utiliza el hecho de que cuando un token de preprocesador es no definido como un cro, se expande a sí mismo. Cuando, por otro lado, es definido se expande a una cadena vacía, o su definición. A menos que una de sus macros tenga su propio nombre como definición, este truco debería funcionar.
Descargo de responsabilidad: ¡Utilice esto bajo su propio riesgo!
(... porque yo sin duda alguna no lo uso!)
EDIT 2:
La salida de montaje de gcc -O0 -S
para el programa anterior es:
.file "test.c"
.section .rodata
.LC0:
.string "Error: X"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
leave
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.4.3"
.section .note.GNU-stack,"",@progbits
Incluso sin optimización, GCC reduce este programa a una sola llamada puts()
.Este programa produce exactamente la misma salida de montaje:
#include <stdio.h>
int main() {
puts("Error: X");
return 0;
}
Por lo tanto, usted es probablemente no va a tener ningún problema de rendimiento, dependiendo de su compilador y las optimizaciones ...
posible duplicado de [macro dependiente macro] (http://stackoverflow.com/questions/4927976/macro-dependent-macro) – kennytm