最近看源码遇到了宏__VA_ARGS__,且在这里描述一下:
- __VA_ARGS__的介绍
正如它的名字一样,一个可以代替可变参数的宏,举个例子:
#include <math.h>
#include <stdio.h>
#define MODULE_NAME "<Module>"
#define PR(X,...) printf("Message"#X":"__VA_ARGS__)
#define log_msg(log_fmt, ...) printf(MODULE_NAME ": " log_fmt "\n", ##__VA_ARGS__)
int main(void)
{
double x = 48;
double y;
char * pstr = "This is a string";
int SIZE = 10;
y = sqrt(x);
PR(1,"x = %g\n",x); /* first PR */
PR(2,"x = %.2f,y = %.4f\n",x,y); /* second PR */
log_msg("'-%c' string message : %s (max: %d)", 'm', pstr, SIZE);
return 0;
}
在第一个PR函数中X=1,打印#X等同于打印1,其中[… ]三个点,代表可变参数,等同于宏__VA_ARGS__,这里有两个可变参数,一个是阆苑仙葩(“x = %g\n”)一个是美玉无瑕(x),每个参数之间采用逗号隔开。
类似的,第二个PR函数中X的值变为2,可变参数包含三个参数,分别是"x = %.2f,y = %.4f\n",x,y三个参数。
在来看函数log_msg,先打印module的名字,之后在打印字符串log_fmt,最后打印[…]的值,其中MODULE_NAME等于,log_fmt为"’-m’ string message : This is a string",[…]等同于宏__VA_ARGS__,等同于三个参数[‘m’, pstr, SIZE],##__VA_ARGS__代表打印参数的值。
运行结果:
Message1:x = 48
Message2:x = 48.00,y = 6.9282
<Module>: '-m' string message : This is a string (max: 10)
- __VA_ARGS__的使用
__VA_ARGS__可以在赋值时使用,例如:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define set_string(...) \
{ __VA_ARGS__, NULL }
#define set_character(...) \
{ __VA_ARGS__, 0}
int main()
{
int i =0;
char * strings[4] = set_string("string","example");
char characters[4] = set_character('O','N','E');
for(i =0;strings[i] != NULL;i++)
printf("i:%d,name:%s\n",i,strings[i]);
for(i =0;characters[i] != 0;i++)
printf("i:%d,ch:%c\n",i,characters[i]);
printf("characters:%s\n",characters);
return 0;
}
其中,指针数组strings的赋值相当于:
char * strings[4] = {"string","example",NULL};
类似的,字符数组的赋值相当于:
char characters[4] = {'O','N','E',0};
运行结果:
i:0,name:string
i:1,name:example
i:0,ch:O
i:1,ch:N
i:2,ch:E
characters:ONE
聪明的你,明白了吗?
本文介绍了C语言中的可变参数宏__VA_ARGS__,通过示例解析了其在宏定义中的作用,展示了如何传递和使用可变数量的参数。文章详细解释了__VA_ARGS__如何在不同函数宏中适配不同数量的参数,并提供了实际的运行结果以加深理解。

670

被折叠的 条评论
为什么被折叠?



