/* C语⾔宏定义之可变参数 */ #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...
##号的作用是: 如果可变参数部分( args...) 被忽略或为空,那么 "##" 操作会使预处理器 (preprocessor) 去掉它前面的那个逗号。如果在调用宏时,确实提供了一些可变参数,GNU C 也会正常工作,它会把这些可变参数放在逗号的后面;如果没有提供,它就会自动去掉前面的逗号,使宏结束展开 --- 补充完右边括号。 另...
于C标准库的语言,printf、scanf、sscanf、sprintf、sscanf入输出函数,參数都是可变的。在调试程序时。我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一个不错的选择。 在C99中规定宏也能够像函数一样带可变的參数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__...
有一个记录日志的函数,想用宏定义进行包装,简化调用方法,但是xlc报如下的错误: void _log(const int level, char* file, int line, const char* fmt, ...){ va_list ap; int count; time_t t; struct tm* st; char str_time[255]; memset(str_time, 0x00, sizeof(str_time)); time(&t); ...
大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 (2)带参数名 第20行代码用 __VA_ARGS__来代表宏定义参数中的三个点(...),也就是可变参数。 再来说说“##”。如果调用:debug2("code = %d",100); 这样调用没有问题。
第一步 可变参数表示 用三个点…来表示,查看printf()函数和scanf()函数的声明: int printf(const char *, ...); int scanf(const char *, ...); 这三个点用在宏中就是变参宏(Variadic Macros),默认名称为__VA_ARGS__。如: #define WriteLine(...) { printf(__VA_ARGS__); putchar('\n')...
可变参数:关于宏定义的可变参数的关键是定义的时候使用省略号,引用的时候使用_ _VA_ARGS_ _ ,例如: //本例子摘自C99:6.10.3.5 - EXAMPLE 7 //定义: #define debug(...) fprintf(stderr, _ _VA_ARGS_ _) //使…
__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的。 GCC、VC2005开始支持。 #define CALCSUM(v, ...) sum(v, __VA_ARGS__) int sum(int num_args, ...) { int val = 0; va_list ap; int i; va_start(ap, num_args); ...
标识符中的...代表可变参数,args表示可变参数的名字,__LINE__是编译器内置的宏定义,表示当前行号。对于以上宏定义,如果我们传入的可变参数为空,会造成fprintf参数中多了一个逗号从而报错,为了解决这个问题,使用##表示如果可变参数为空,预处理器将去除掉它前面的那个逗号。