可变参数函数参数的自动类型促销是什么?

时间:2011-08-16 20:51:10

标签: c runtime-error variadic-functions

请考虑以下代码段:

#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 个答案:

答案 0 :(得分:6)

其他人忘记提及的另一种情况是指针类型,特别是NULL。由于这可能会扩展到0(void*)0(或其他一些奇怪的事情),因此您不知道编译器是否在列表中放置了intvoid*。由于这些可能有不同的宽度,这可能会导致恼人的错误。

答案 1 :(得分:3)

您可以使用va_argcharsigned charunsigned charshortunsigned 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