由 Gea-Suan Lin's Blog 節錄來的

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()。