C语⾔宏定义之可变参数
可变参数宏定义
C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使⽤拥有可以变化的参数表的宏。可变参数宏就像下⾯这个样⼦:
#define dbgprint(...) printf(__VA_ARGS__)
缺省号代表⼀个可以变化的参数表。使⽤保留名 __VA_ARGS__ 把参数传递给宏。当宏的调⽤展开时,实际的参数就传递给 printf()了。
可变参数宏不被ANSI/ISO C++ 所正式⽀持。因此,你应当检查你的编译器,看它是否⽀持这项技术。
⽤GCC和C99的可变参数宏,更⽅便地打印调试信息
#ifdef DEBUG
#define dbgprint(format, ...) \
fprintf(stderr, format, __VA_ARGS__)
#else
#define dbgprint(format, ...)
#endif
在标准C⾥,你不能省略可变参数,但是你却可以给它传递⼀个空的参数。例如,下⾯的宏调⽤在ISO C⾥是⾮法的,因为字符串后⾯没有逗号:
dbgprint ("A message")
GNU CPP在这种情况下可以让你完全的忽略可变参数。在上⾯的例⼦中,编译器仍然会有问题(complain),因为宏展开后,⾥⾯的字符串后⾯会有个多余的逗号。
为了解决这个问题,CPP使⽤⼀个特殊的'##'操作。书写格式为:
#define dbgprint(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
这⾥,如果可变参数被忽略或为空,'##'操作将使预处理器(preprocessor)去除掉它前⾯的那个逗号。
如果你在宏调⽤时,确实提供了⼀些可变参数,GNU CPP也会⼯作正常,
它会把这些可变参数放到逗号的后⾯。象其它的pasted macro参数⼀样,这些参数不是宏的扩展。
/* C语⾔宏定义之可变参数 */fprintf格式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MDEBUG
#ifdef MDEBUG
#define TEST_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__)
#else
#define TEST_LOG(format,...)
#endif
int test()
{
int num = 10;
TEST_LOG("my num is %d .\n", num);
return num;
}
int main()
{
test();
printf("--------ok-------\n");
return0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论