多参数函数或宏定义

多参数函数

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");     //正常编译,正常打印
相关推荐
码小猿的CPP工坊1 小时前
C++软件开发之内存泄漏闭坑方法
开发语言·c++
Benny_Tang1 小时前
题解:CF2164C Dungeon
c++·算法
青小莫2 小时前
C语言vsC++中的动态内存管理(内含底层实现讲解!)
java·c语言·c++
持梦远方2 小时前
算法剖析1:摩尔投票算法 ——寻找出现次数超过一半的数
c++·算法·摩尔投票算法
AI视觉网奇3 小时前
ue5 自定义 actor ac++ actor 用法实战
java·c++·ue5
明洞日记3 小时前
【软考每日一练002】进程调度机制详解
c++·ai·操作系统·进程
FMRbpm3 小时前
树的练习6--------938.二叉搜索树的范围和
数据结构·c++·算法·leetcode·职场和发展·新手入门
C+-C资深大佬4 小时前
C++数据类型
开发语言·c++·算法
初次见面我叫泰隆5 小时前
Qt——1、初识Qt
开发语言·c++·qt
兵哥工控5 小时前
MFC 对话框Alt+F4退出程序实例
c++·mfc