可变参数函数参数的自动类型促销是什么?
请考虑以下代码段:
#include #include 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时,允许使用哪些类型,如何知道使用哪种类型以及避免此类运行时错误。
其他人忘记提及的另一种情况是指针类型,特别是关键是NULL
。 由于这可能会扩展为0
或(void*)0
(或其他一些奇怪的东西),您将无法知道编译器是否在列表中放置了int
或void*
。 由于这些可以具有不同的宽度,这可能导致恼人的错误。
除了char
, signed char
, unsigned char
, short
, unsigned short
, _Bool
和float
之外,您可以将任何标准类型与va_arg
一起使用。 实现可能定义了也具有低于int
整数转换等级的其他非标准类型,或者同样非标准的小型浮点类型,但除非您打算使用它们,否则您不需要知道这些,因此出于实际目的我给出的清单是完整的。
使用va_arg时, char
被提升为int
。 还有其他类型(由@R ..给出的列表)。
所以为了把它读作char
你必须做类型转换。
喜欢:c =(char)va_arg(ap,int);
有关完整示例,请参阅:
http://en.cppreference.com/w/cpp/language/variadic_arguments