程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 可變參數的宏

可變參數的宏

編輯:關於C語言
 

調試的時候需要打印一些調試信息,剛開始的做法如下
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");
雖然這樣子不會影響到程序的運行,但是萬一產生某些副作用呢???於是到網上搜了一下,找到了下面的解決方案:
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__)
將之應用於我的需求,可以修改如下:
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不知道還在哪呢!

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved