You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用枚举类型为函数时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:35:26