可变参数宏__VA_ARGS__

本文介绍了C语言中的可变参数宏__VA_ARGS__,通过示例解析了其在宏定义中的作用,展示了如何传递和使用可变数量的参数。文章详细解释了__VA_ARGS__如何在不同函数宏中适配不同数量的参数,并提供了实际的运行结果以加深理解。

最近看源码遇到了宏__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

聪明的你,明白了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值