多参数函数或宏定义

本文详细介绍了C++中的多参数函数,如`va_list`,`va_start`,`va_arg`,和`va_end`的使用方法,以及`__VA_ARGS__`在宏定义中的应用,通过示例展示了如何实现类似printf的功能和不同宏的调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多参数函数

typedef char *va_list;

va_start 获取可变参数列表的第一个参数的地址

va_arg 获取可变参数的当前参数,返回指定类型并将指针指向下一参数

va_end宏 清空va_list可变参数列表

具体使用:

//简陋实现printf
void myPrint(const char* fmt, ...)
{
	va_list ap;
	va_start(ap, fmt);

	const char* c = fmt;
	while (*c++ != '\0')
	{
		if (*c == 's')
		{
			char* val = va_arg(ap, char*);
			std::cout << val << std::endl;
		}
		else if (*c == 'd')
		{
			int val = va_arg(ap, int);
			std::cout << val << std::endl;
		}
		else if (*c == 'f')
		{
			double val = va_arg(ap, double);
			std::cout << val << std::endl;
		}
	}

	va_end(ap);
}

//调用测试
myPrint("%d%f%s", 100, 99.98f, "abcdefg");

打印输出:

100
99.98
abcdefg
 

多参数宏定义

__VA_ARGS__用于传递多参数

#define MyPrint(fmt, ...) \
    printf(fmt, __VA_ARGS__);

#define MyPrint2(fmt, ...) \
    printf(fmt, #__VA_ARGS__);

#define MyPritf3(fmt, ...) \
    printf(fmt, ##__VA_ARGS__);


//调用测试
MyPrint("%d %f %s\n", 100, 99.98f, "abcdefg");
MyPint2("%s\n", 100, 99.98f, "abcdefg");
MyPritf3("%d %f %s\n", 100, 99.98f, "abcdefg");

输出结果:

100 99.980003 abcdefg            没有#
100, 99.98f, "abcdefg"              带有一个# (把参数通过逗号连接成一个字符串)
100 99.980003 abcdefg            带有两个#

再次测试:

//调用测试 无参数
MyPrint("abc");      //低版本的会报错
MyPrint2("abc");     //编译报错
MyPritf3("abc");     //正常编译,正常打印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JL_MG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值