【C / C++】可变参数个数函数的注意事项

#include <stdarg.h>

void f(int _Count, ...) {
    
    
	va_list args;
	va_start(args, _Count);
	//...
	va_arg(args, int);
	//...
	va_end(args);
}

int main() {
    
    
	//...
}

可变数量参数部分必须列写在函数参数的最后,用三个点 “…” 表示。

使用 va_list 声明一个可变参数列表。

当开始依次读取可变参数时,使用 va_start。第一个参数为之前通过 va_list 声明的可变参数列表,第二个参数为参数名,接下来将在该参数之后开始读取。

使用 va_arg 访问可变参数列表中的下一个参数。 va_arg 的第一个参数为可变参数列表,第二个参数为参数类型。
注意:
va_arg 不检查输入到 va_list 的参数的类型是否匹配。如果不匹配,则行为未定义。例如,如果要求参数类型为 long long,但输入参数为无 ll 后缀的字面量数字,就会导致读出错误的参数值:

//...
int g(int _Count, ...) {
    
    
	va_list args;
	va_start(args, _Count);
	//...
	va_arg(args, long long);
	//...
	va_end(args);
}
//...
int main() {
    
    
	//...
	g(4, 1, 1, 1, 1);
	//...
}

在语句

g(4, 1, 1, 1, 1);

中,数字 1 为字面量,其类型默认为 int。但函数 g 在读取可变参数列表时,要求 long long 类型。这将使得无法正确读出参数。所以上述语句要改写成

g(4, 1ll, 1ll, 1ll, 1ll);

后缀 ll 代表字面量数字的类型为 long long。
另一个例子是可变参数列表要求读入 double 类型的数,但直接输入了整数作为参数。

读取完毕后,使用 va_end 结束读取。

おすすめ

転載: blog.csdn.net/COFACTOR/article/details/116212794