C语言 可变参数函数参数的自动类型提升是什么?

zhte4eai  于 2023-03-07  发布在  其他
关注(0)|答案(3)|浏览(126)

请考虑以下代码片段:

#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时,允许使用哪些类型,如何知道使用哪种类型并避免此类运行时错误。

h43kikqp

h43kikqp1#

另一个其他人忘记提到的情况是指针类型,特别是NULL。因为它可以扩展到0(void*)0(或其他一些奇怪的东西),所以你不知道编译器是否将intvoid*放入列表中。因为它们可以有不同的宽度,这可能会导致恼人的bug。

zpgglvta

zpgglvta2#

除了charsigned charunsigned charshortunsigned short_Boolfloat之外,您可以将任何标准类型与va_arg一起使用。有可能某个实现定义了其他非标准类型,它们的整数转换等级也低于int,或者定义了非标准小浮点类型,但是除非你打算使用它们,否则你不需要知道这些,所以为了实用的目的,我给出的列表是完整的。

8zzbczxx

8zzbczxx3#

当使用va_arg时,char被提升为int。还有其他类型(由@R..给出的列表)被提升。
所以为了把它读成char,你必须进行类型转换。

char c = (char) va_arg(ap, int);

有关完整列表,请参阅以下位置的“默认转换”部分:
http://en.cppreference.com/w/cpp/language/variadic_arguments

相关问题