int32 rgctl_debug=1;
#define RGCTL_DEBUG( format , arg...)
do{ if(rgctl_debug) printf(format " %s %d",##arg,__FILE__,__LINE__);}while(0)
#ifdef _DEBUG
#define DEBUG(format, args...) printf("[%s:%d] "format, __FILE__, __LINE__, ##args)
#else
#define DEBUG(args...)
#endif
#define PRINTF_FL(format, ...) \
printf(format " %s %d", __VA_ARGS__, __FILE__, __LINE__)
ref.
http://pinglunliao.pixnet.net/blog/post/4365557-%E4%B8%80%E4%BA%9B-c-macro-%E7%9A%84%E6%8A%80%E5%B7%A7
Part I:不定變數
幾個學校課程不太會講到的技巧,第一個是不定變數的使用:
#ifdef DEBUG
#define debug_printf(str, ...) do { printf(str, __VA_ARGS__); } while (0)
#else
#define debug_printf(str, ...)
#endif
關鍵是 __VA_ARGS__,這樣可以很愉快的使用 debug_printf()。
這個 macro 在遇到
debug_printf("no params");
這樣的用法時,會展開成
printf("no params",);
(注意逗號),然後就出問題了。
GNU cpp 和 C99 都有對應解法,gnu cpp info 的 Variadic Macros 這一節有說明。
Part II:將傳入的參數變成字串
另外一個技巧是將傳入的參數變成字串:
#define print_var(var) do { printf("%s: %s\n", #var, var); } while (0)
關鍵字是 #var。當輸入 print_var(argv[0]); 時就會把以上的 Macro 展開為 printf("%s: %s\n", "argv[0]", argv[0]);。
Part III:將傳入的參數名稱變化
假設你想要把傳入參數名稱再變化,用 ## 穿插其中:
#define print_three_var(var)
do {
print_var(var);
print_var(var##2);
print_var(var##3);
} while (0)
因為你不能用 var2 來表示 var + "2",所以你必須用 ##。當你傳入 print_three_var(telephone) 時,他會展開成:
print_var(telephone);
print_var(telephone2);
print_var(telephone3);
補充一下:這邊的 print_var() 是 Part II 裡的 print_var()。
沒有留言:
張貼留言
有敘述錯誤或者是觀念有問題歡迎指正