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

enum种类型是否会经历默认参数提升?

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

推荐答案

可以,根据为enum Select 的基础类型,可以进行默认参数提升.

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

Each enumerated type shall be compatible with 100, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined, but shall be capable of representing the values of all the members of the enumeration.枚举类型为 不完整,直到紧跟在终止列表的}之后 枚举数声明,然后完成

因此,实现可以 Select 使用小于int的类型作为基础类型,如果是这样的话,它将受到默认参数提升的影响.如果您指定-fshort-enums旗,GCC尤其会这样做.

如果是这样的话,你就不能把这enum作为变量函数的最后一个命名参数.摘自关于va_start的第7.16.1.4p4节:

参数parmN是中最右边的参数的标识符 函数定义中的变量参数列表(刚刚 之前,...).If the parameter 100 is declared with the 103 storage class, with a function or array type, or with a type that is not compatible with the type that results after application of the default argument promotions, the behavior is undefined.

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

POSIX文件描述符位置

ATmega328P USART发送字符重复打印

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

将uintptr_t添加到指针是否对称?

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

C语言中的数字指针

将回调/基于事件的C API转换为非回调API

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

如何修复我的qsort()算法?它每次都给出不同的结果

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

生成的头文件不包括用户定义的文件

在C中打印指针本身

STM32:代码的执行似乎取决于它在闪存中的位置

无法理解 fgets 输出

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

为什么使用 C 引用这个 char 数组会导致 Stack smasing?