为何调用枚举类型为函数时C++编译器无报错而C编译器报错?
C与C++中枚举类型
myenum()调用的差异原因 测试代码
#include <stdio.h> typedef enum{ V1=1, V2 }myenum; void fun(myenum val){ printf("%d",val); } int main(){ fun(myenum());//why no error return 0; }
测试结果
使用gcc(C编译器)编译时会报错,错误信息如下:
main.c: 在函数‘main’中:
main.c:22:6: 错误:‘myenum’之前应有表达式
22 | fun(myenum());//why no error
使用g++(C++编译器)编译则可正常通过。
问题
为何调用myenum()时C++编译器无报错,C编译器却报错?
解答
这是C和C++对枚举类型的定义与语法支持存在本质差异导致的:
- 在C语言中,枚举类型本质上是整数类型的别名,没有独立的类型体系,也不支持构造式语法。
myenum()这种写法在C里完全不合法,C编译器会把myenum当作类型名,而类型名后接()是函数调用语法,但此处没有对应的函数,因此报错提示需要表达式。 - 在C中,枚举类型是独立的强类型,支持默认值初始化的构造式写法。
myenum()会触发枚举类型的默认初始化,得到值为0的枚举实例(C中基本类型和枚举类型的默认初始化会置零),该值可正常传递给参数类型为myenum的fun函数,因此编译通过。
内容的提问来源于stack exchange,提问作者add
相关产品推荐
相关产品推荐

