gpt4 book ai didi

c - 枚举类型会进行默认参数提升吗?

转载 作者:行者123 更新时间:2023-12-05 02:27:22 25 4
gpt4 key购买 nike

可变参数函数中 ... 之前的最后一个参数的类型可以是枚举类型吗?

enum 类型会进行默认参数提升吗?

在某些情况下,不能安全地使用经过默认参数提升的类型,可变参数处理(va_startva_arg)就是一个显着的例子。我使用的编译器似乎将 enum 类型视为 int,在这些上下文中使用它是安全的。总是这样吗?我可以安全地将枚举类型用作可变参数函数中 ... 之前的最后一个参数吗?

最佳答案

是的,根据为 enum 选择的基础类型,可以发生默认参数提升。

来自 C standard 的第 6.7.2.2 节关于枚举说明符:

Each enumerated type shall be compatible with char, a signed integertype, or an unsigned integer type. The choice of type isimplementation-defined, but shall be capable of representing thevalues of all the members of the enumeration. The enumerated type isincomplete until immediately after the } that terminates the list ofenumerator declarations, and complete thereafter

因此,实现可能会选择使用小于 int 的类型作为基础类型,如果是这样,那么它会受到默认参数提升的影响。如果您指定 -fshort-enums 标志,GCC 特别会执行此操作。

如果是这种情况,您不能将那个 enum 用作可变参数函数中的最后一个命名参数。来自关于 va_start 的 7.16.1.4p4 部分:

The parameter parmN is the identifier of the rightmost parameter inthe variable parameter list in the function definition (the one justbefore the , ...). If the parameter parmN is declared with theregister storage class, with a function or array type, or with a typethat is not compatible with the type that results after application ofthe default argument promotions, the behavior is undefined.

关于c - 枚举类型会进行默认参数提升吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73278375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com