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

可變參數的宏

編輯:C++入門知識


一般在調試打印Debug 信息的時候, 需要可變參數的宏. 從C99開始可以使編譯器標准支持可變參數宏(variadic macros), 另外GCC 也支持可變參數宏, 但是兩種在細節上可能存在區別.
1. __VA_ARGS__
__VA_ARGS__ 將"..." 傳遞給宏.如
#define debug(format, ...) fprintf(stderr, fmt, __VA_ARGS__)
在GCC中也支持這類表示, 但是在G++ 中不支持這個表示.
2. GCC 的復雜宏
GCC使用一種不同的語法從而可以使你可以給可變參數一個名字,如同其它參數一樣。
#define debug(format, args...) fprintf (stderr, format, args)
這和上面舉的那個定義的宏例子是完全一樣的,但是這麼寫可讀性更強並且更容易進行描述。
3. ##__VA_ARGS__
上面兩個定義的宏, 如果出現debug("A Message") 的時候, 由於宏展開後有個多余的逗號, 所以將導致編譯錯誤. 為了解決這個問題,CPP使用一個特殊的‘##’操作。
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
這裡,如果可變參數被忽略或為空,‘##’操作將使預處理器(preprocessor)去除掉它前面的那個逗號。如果你在宏調用時,確實提供了一些可變參數,GNU CPP也會工作正常,它會把這些可變參數放到逗號的後面。
4. 其他方法
一種流行的技巧是用一個單獨的用括弧括起來的的 "參數" 定義和調用宏, 參數在宏擴展的時候成為類似 printf() 那樣的函數的整個參數列表。
#define DEBUG(args) (printf("DEBUG: "), printf(args))

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