请考虑以下代码段:
#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时,允许使用哪些类型,如何知道使用哪种类型并避免此类运行时错误。
答案 0 :(得分:6)
其他人忘记提及的另一种情况是指针类型,特别是NULL
。由于这可能会扩展到0
或(void*)0
(或其他一些奇怪的事情),因此您不知道编译器是否在列表中放置了int
或void*
。由于这些可能有不同的宽度,这可能会导致恼人的错误。
答案 1 :(得分:3)
您可以使用va_arg
除char
,signed char
,unsigned char
,short
,unsigned short
,{{1}以外的任何标准类型}和_Bool
。实现可能会定义其他非标准类型,它们的整数转换级别也低于float
,或者同样是非标准的小型浮点类型,但除非您打算使用它们,否则您无需了解这些类型,因此出于实际目的,我给出的清单已经完成。
答案 2 :(得分:0)
使用va_arg时,char
会提升为int
。还有其他类型(由@R ..给出的列表),这些类型被提升。
因此,为了将其作为char
读取,您必须进行类型转换。
像: c =(char)va_arg(ap,int);
完整示例请参阅:
http://en.cppreference.com/w/cpp/language/variadic_arguments