多参数函数或宏定义

多参数函数

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");     //正常编译,正常打印
相关推荐
_Narcissus_27 分钟前
B+树的概念和操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
aichitang202430 分钟前
快乐泛函每一天!内积空间
c++·python·数学·算法·机器学习·ai·泛函分析
Ravikov33 分钟前
工具开发-ESP32程序管理系统 | 具体实现(一)
c++
欧特克_Glodon2 小时前
OpenCV计算机视觉开发入门与实践<十六>:图像边框和图像轮廓
c++·人工智能·opencv·计算机视觉
wuminyu2 小时前
JDK21中FFM api的upcall回调机制解析
java·linux·c语言·jvm·c++
我变成萤火虫8 小时前
河南萌新联赛2026第(四)场:南阳理工学院
数据结构·c++·算法·贪心算法·stl·动态规划
余额瞒着我当琳12 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
ShineWinsu14 小时前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
牛油果子哥q17 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客17 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译