1)VA_ARGS:整体来说就是将左边宏中 ... 的内容原样抄写在右边 VA_ARGS 所在的位置。它是一个可变參数的宏,是新的C99规范中新增的,眼下似乎仅仅有gcc支持(VC从VC2005開始支持)。要注意的是,printf 的输出格式是括号内左边是字符串,右边是变量,并且右变量与左输出格式是一一相应的。所以在上面那个样例中, ...
这样,预处理宏__VA_ARGS__可用在替换部分中,表示省略号代表什么。例如,下面的定义: #define PR(...) printf(__VA_ARGS__) 假设稍后调用该宏: PR("Howdy"); PR("Weight = %d, shipping = $%.2f\n", wt, sp); 对于第1次调用,__VA_ARGS__展开为1个参数:"Howdy"。 对于第2次调用,__VA_...
#define qWiFiDebug(format, ...) qDebug("[WiFi] "format" File:%s, Line:%d, Function:%s", ##__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__); 上面的宏是使用qDebug输出调试信息,在非Qt的程序中也可以改为printf,守护进程则可以改为syslog等等... 其中,决窍其实就是这几个宏 ##__VA...
__VA_ARGS__符号 可变参数列表,如果是多个参数,必须是最后一个参数,代表剩余的。 //例子__VA_ARGS__表示前面的...所有参数,前面再加个#表示字符串化即转为字符串形式#defineLOG(...) printf("log-->%s\n",#__VA_ARGS__)LOG("hello,world");//打印出 log-->"hello,world"LOG(123);//打印出 ...
\ static int __init __driver##_init(void) \ { \ return __register(&(__driver) , ##__VA_ARGS__); \ } \ module_init(__driver##_init); \ static void __exit __driver##_exit(void) \ { \ __unregister(&(__driver) , ##__VA_ARGS__); \ } \ module_exit(__driver##_...
//printf(__VA_ARGS__); }*/intmain() { ABC("%s\n","hello");return0; } 注意上面说的是宏可以接受可变参数,而不是用函数(函数中涉及的可变数目参数问题需要用到va_list)。 另外__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC...
// 计算 __VA_ARGS__ 参数个数,最大支持64个参数 #define FL_ARG_COUNT(...) FL_INTERNAL_ARG_COUNT_PRIVATE(0, ##__VA_ARGS__,\ 64, 63, 62, 61, 60, \ 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \ 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \ 39, 38, 37, 36...
可变参数宏 __VA_ARGS__:__VA_ARGS__是C99引入的,用于宏定义中,可以替换为宏调用时传递的所有参数。它类似于函数参数,但不能访问单个参数或获取参数数量,仅用于整体替换。例如,宏定义#define foo printf中,__VA_ARGS__会被替换为宏调用时除了fmt外的所有参数。额外的逗号问题:当使用可变...
▌可变参数宏 __VA_ARGS__: 由C99 引入, 声明语法类似于可变参数函数:逗号后面三个句点"...",表示一个或多个参数。但常见编译器也允许传递0个参数。宏扩展时使用特殊标识符__VA_ARGS__表示所传递的参数的替换。没办法访问可变参数列表内的单个参数,也不能获知多少个参数被传递。 例子: #define foo(f, ....
引言在调试过程中,我们经常会自定义打印,比如日志信息的输出,这时就会用VA_ARGS,接下来详细讲解! VA_ARGS __VA_ARGS__是C语言设定的一个预定义宏,用于处理可变参数的参数列表。...通常用在宏定义中,以便宏可以接收不定数量的参数,并将他们作为整体处理。...通常的函