爲什麼不簡單定義ASSERT
取決於該宏?使用C條件語句
#ifdef MACRO
#define ASSERT(NAME, TEST) \
do { \
printf("Assert failed"); \
} while(0)
#else
#define ASSERT(NAME, TEST) {}
#endif
使用固定的值預處理應避免 - 確保編譯器應該從優化死代碼,但是爲什麼依靠,當你基本上可以去掉實際的C代碼?
編輯:
有相當難看伎倆涉及宏參數字串,你可能能夠使用:
#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;
}
此輸出:
$ ./test
Error: X
本質上,它使用事實上,當預處理器令牌是而不是定義爲ma它會擴大到自己。另一方面,當它被定義爲時,它將擴展爲空字符串或其定義。除非你的一個宏有其自己的名字作爲定義,這個黑客應該工作。
免責聲明:使用此信息需自擔風險!
(...因爲我肯定會不使用它!)
編輯2:
的gcc -O0 -S
裝配輸出上面的程序是:
.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
即使沒有優化,海灣合作委員會減少此計劃爲一個puts()
電話。這個程序產生完全相同的彙編輸出:
#include <stdio.h>
int main() {
puts("Error: X");
return 0;
}
因此,你可能不會有任何性能問題,這取決於你的編譯器和任何的優化...
的可能重複的[宏取決於宏](http://stackoverflow.com/questions/4927976/macro-dependent-macro) – kennytm 2011-03-28 19:53:29