可变参数函数
来自cppreference.com
< c
可变参数函数是使用可变数量实参的函数(例如 printf)。
可变参数函数使用在其最后一个参数后加省略号声明,例如 int printf(const char* format, ...);。语法和自动实参转换的额外细节见变长实参。
从函数体内使用以下工具访问可变实参:
类型 | |
| 保有 va_start、va_arg、va_end 及 va_copy 所需的信息 (typedef) | |
宏 | |
在标头
<stdarg.h> 定义 | |
| 令函数得以访问可变实参 (宏函数) | |
| 访问下一个可变函数实参 (宏函数) | |
(C99) |
创造函数可变实参的副本 (宏函数) |
| 结束对函数可变实参的遍历 (宏函数) | |
示例
打印不同类型的值。
运行此代码
#include <stdarg.h>
#include <stdio.h>
void simple_printf(const char* fmt, ...)
{
va_list args;
for (va_start(args, fmt); *fmt != '\0'; ++fmt)
{
switch(*fmt)
{
case 'd':
{
int i = va_arg(args, int);
printf("%d\n", i);
break;
}
case 'c':
{
// 将提升 'char' 类型值为 'int'
// C 中字符常量自身为 'int' 类型
int c = va_arg(args, int);
printf("%c\n", c);
break;
}
case 'f':
{
double d = va_arg(args, double);
printf("%f\n", d);
break;
}
default:
puts("Unknown formatter!");
goto END;
}
}
END:
va_end(args);
}
int main(void)
{
simple_printf("dcff", 3, 'a', 1.969, 42.5);
}
输出:
3
a
1.969000
42.50000
引用
- C23 标准(ISO/IEC 9899:2024):
- 7.16 Variable arguments <stdarg.h> (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 7.16 Variable arguments <stdarg.h> (第 TBD 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.16 Variable arguments <stdarg.h> (第 269-272 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.15 Variable arguments <stdarg.h> (第 249-252 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.8 VARIABLE ARGUMENTS <stdarg.h>
参阅
可变参数函数的 C++ 文档
|