多参数函数或宏定义

多参数函数

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");     //正常编译,正常打印
相关推荐
The Chosen One9851 小时前
C++ : AVL树-详解
开发语言·c++
zzyzxb1 小时前
std::enable_shared_from_this
c++
SNAKEpc121381 小时前
QML和Qt Quick
c++·qt
hansang_IR1 小时前
【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
c++·数学·算法·dfs·题解·向量·点积
GanGuaGua1 小时前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
怀旧,2 小时前
【C++】18. 红⿊树实现
开发语言·c++
lsnm2 小时前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
宁静致远20212 小时前
【C++设计模式】第三篇:观察者模式(别名:发布-订阅模式、模型-视图模式、源-监听器模式)
c++·观察者模式·设计模式
Cinema KI3 小时前
内存管理这一块
c++
1白天的黑夜13 小时前
哈希表-49.字母异位词分组-力扣(LeetCode)
c++·leetcode·哈希表