请考虑以下代码片段:
#include <stdio.h>
#include <stdarg.h>
void display(int num, ...) {
char c;
int j;
va_list ptr;
va_start(ptr,num);
for (j= 1; j <= num; j++){
c = va_arg(ptr, char);
printf("%c", c);
}
va_end(ptr);
}
int main() {
display(4, 'A', 'a', 'b', 'c');
return 0;
}
程序会给出运行时错误,因为vararg会自动将char提升为int,而在这种情况下我应该使用int。
当我使用vararg时,允许使用哪些类型,如何知道使用哪种类型并避免此类运行时错误。
3条答案
按热度按时间h43kikqp1#
另一个其他人忘记提到的情况是指针类型,特别是
NULL
。因为它可以扩展到0
或(void*)0
(或其他一些奇怪的东西),所以你不知道编译器是否将int
或void*
放入列表中。因为它们可以有不同的宽度,这可能会导致恼人的bug。zpgglvta2#
除了
char
、signed char
、unsigned char
、short
、unsigned short
、_Bool
和float
之外,您可以将任何标准类型与va_arg
一起使用。有可能某个实现定义了其他非标准类型,它们的整数转换等级也低于int
,或者定义了非标准小浮点类型,但是除非你打算使用它们,否则你不需要知道这些,所以为了实用的目的,我给出的列表是完整的。8zzbczxx3#
当使用va_arg时,
char
被提升为int
。还有其他类型(由@R..给出的列表)被提升。所以为了把它读成
char
,你必须进行类型转换。有关完整列表,请参阅以下位置的“默认转换”部分:
http://en.cppreference.com/w/cpp/language/variadic_arguments