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

4 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;
}
Run Code Online (Sandbox Code Playgroud)

该程序给出了运行时错误,因为vararg自动将char提升为int,在这种情况下我应该使用int.

当我使用vararg时,允许使用哪些类型,如何知道使用哪种类型以及避免此类运行时错误.

Jen*_*edt 6

其他人忘记提及的另一种情况是指针类型,NULL尤其重要.由于这可能扩展到0(void*)0(或其他一些奇怪的东西),你不会知道编译器是否在列表中放入int或者a void*.由于这些可以具有不同的宽度,这可能导致恼人的错误.


R..*_*R.. 5

您可以将任何标准类型与va_argexcept charsigned charunsigned charshortunsigned short_Bool、 和 一起使用float。一个实现可能定义了额外的非标准类型,这些类型的整数转换等级也低于int,或者同样是非标准的小浮点类型,但除非你打算使用它们,否则你不需要知道这些,因此出于实际目的,列表我给的是完整的。