多参数函数
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"); //正常编译,正常打印