基本介紹
- 中文名:可變參數宏
- 外文名:variadic macro
- 語言:C,C++
聲明語法
實現支持
- GNU Compiler Collection3.0,
- Visual Studio 2005,
- C++Builder2006,
- Oracle Solaris Studio(Sun Studio) Forte Developer 6 update 2 (C++ version 5.3).
具體介紹
關於“## __VA_ARGS__”宏的介紹和使用
#define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg)
void printf(const char* format, ...);
#define debug(...) printf(__VA_ARGS__)
Debug("Y = %d\n", y);
printf("Y = %d\n", y);
debug("test"); // 一個參數
gcc的預處理提供的可變參數宏定義
#ifdef DEBUG #define dbgprint(format,args...) \ fprintf(stderr, format, ##args) #else #define dbgprint(format,args...) #endif
#define dgbmsg(fmt,...) printf(fmt,__VA_ARGS__)
具體使用如下:
#include <stdarg.h> #include <stdio.h> #define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__) int main() { LOGSTRINGS("hello, %d ", 10); return 0; }
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
GCC始終支持複雜的宏,它使用一種不同的語法從而可以使你可以給可變參數一個名字,如同其它參數一樣。例如下面的例子:
#define debug(format, args...) fprintf (stderr, format, args)
在標準C里,你不能省略可變參數,但是你卻可以給它傳遞一個空的參數。例如,下面的宏調用在ISO C里是非法的,因為字元串後面沒有逗號:
debug (“A message”)
GNU CPP在這種情況下可以讓你完全的忽略可變參數。在上面的例子中,編譯器仍然會有問題(complain),因為宏展開後,裡面的字元串後面會有個多餘的逗號。
##__VA_ARGS__
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
#define FUN(IName) IName##_ptr
一種流行的技巧是用一個單獨的用括弧括起來的的 “參數” 定義和調用宏, 參數在 宏擴展的時候成為類似 printf() 那樣的函式的整個參數列表。
#define DEBUG(args) (printf("DEBUG: "), printf args) if (n != 0) DEBUG(("n is %d\n", n));
#define DEBUG(args) (printf("DEBUG: "), printf(args)) #define _ , DEBUG("i = %d" _ i);