可變參數的宏


調試的時候需要打印一些調試信息,剛開始的做法如下:
1 #ifdef _DEBUG
2  //  打印調試信息
3  #endif

這樣的代碼寫得多了,就覺得繁瑣,於是我進行了改進如下: 

1  void DebugPrint( const  char * format, ... );
2 #ifdef _DEBUG
3  #define DEBUG_PRINT DebugPrint
4  #else
5  #define DEBUG_PRINT 
6  #endif

 這樣就可以在調試模式下使用DEBUG_PRINT打印各種類型的數據。


自鳴得意了一段時間,忽然想到了一個問題,在Release模式下,語句:
1 DEBUG_PRINT( " Hello, %s "" World ");

會被擴展成如下:

"Hello, %s", "World";

雖然這樣子不會影響到程序的運行,但是萬一產生某些副作用呢???於是到網上搜了一下,找到了下面的解決方案:
1  void DebugPrint( const  char * format, ... );
2 #ifdef _DEBUG
3  #define DEBUG_PRINT DebugPrint
4  #else
5  #define DEBUG_PRINT /\
6 / DebugPrint
7  #endif
這樣子改好后,在Release模式下,這個宏會被展開為一個注釋,完全消除了副作用。
但是這種方法會用另外一個缺點,DEBUG_PRINT語句后面不能跟其他的可執行語句,否則在release模式下會被注釋掉。

這時候我就想啊,如果C提供可變參數的宏該多好啊,想到了這里,忽然想到C99似乎有對可變參數宏的支持,
於是翻了一下書本,果然啊!

C99下,使用可變參數宏的方式如下:
一個例子,如下:
1  #define MyMax(...) max(__VA_ARGS__)
其中省略號(...)表示可變參數,和C函數的可變參數表示法一樣;__VA_ARGS__決定了可變參數在何處被替換。
對於語句:
MyMax(a, b); 
會被替換為:
max(a, b);

將之應用於我的需求,可以修改如下:
1  void DebugPrint( const  char * format, ... );
2 #ifdef _DEBUG
3  #define DEBUG_PRINT(format, ...) DebugPrint(format, __VA_ARGS__)
4  #else
5  #define DEBUG_PRINT(format, ...)  
6  #endif
現在好了,如果在release模式下,DEBUG_PRINT會被替換為空格,再也沒有副作用了。

針對C99的方式,我做了一下實驗:
在VC2008下運行良好,但是悲催的VC6卻不支持,不過想想也是,VC6誕生的時候C99不知道還在哪呢!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM