多参数函数或宏定义

多参数函数

typedef char *va_list;

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

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

va_end宏清空va_list可变参数列表

具体使用:

cpp 复制代码
//简陋实现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**用于传递多参数

cpp 复制代码
#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 带有两个#

再次测试:

cpp 复制代码
//调用测试 无参数
MyPrint("abc");      //低版本的会报错
MyPrint2("abc");     //编译报错
MyPritf3("abc");     //正常编译,正常打印
相关推荐
博语小屋15 分钟前
转义字符.
c语言·c++
Lhan.zzZ19 分钟前
Qt跨线程网络通信:QSocketNotifier警告及解决
开发语言·c++·qt
Aevget22 分钟前
QtitanDocking 如何重塑制造业桌面应用?多视图协同与专业界面布局实践
c++·qt·界面控件·ui开发·qtitandocking
-森屿安年-28 分钟前
STL中 Map 和 Set 的模拟实现
开发语言·c++
历程里程碑32 分钟前
双指针巧解LeetCode接雨水难题
java·开发语言·数据结构·c++·python·flask·排序算法
ALex_zry1 小时前
C++ 中多继承与虚函数表的内存布局解析
java·开发语言·c++
w-w0w-w1 小时前
C++构造函数与析构函数详解
c++
saber_andlibert1 小时前
【C++转GO】初阶知识
开发语言·c++·golang
Tandy12356_2 小时前
手写TCP/IP协议栈——实现ping响应不可达
c语言·网络·c++·网络协议·tcp/ip·计算机网络
wbs_scy2 小时前
C++:unordered_map/unordered_set 使用指南(差异、性能与场景选择)
开发语言·c++·哈希算法