为何未提前声明的enum在MSVC中可编译通过?
为什么MSVC允许编译未声明枚举的指针代码?
标准要求
C标准(包括C11及之后版本)明确规定:普通枚举类型在未做前置声明的情况下,不能直接以指针/引用形式使用。只有强类型枚举(enum class)或指定了底层类型的普通枚举(如enum E : int;)才能进行不完全类型的前置声明,enum E* kind;这种写法完全不符合标准要求。
MSVC的行为原因
这是MSVC的非标准扩展特性,既不是bug也不属于未定义行为。微软编译器为了兼容早期非标准代码,同时给开发者提供更灵活的语法支持,长期保留了这个扩展——允许在枚举未声明的情况下直接使用其指针或引用类型。
其他编译器的差异
GCC和Clang默认严格遵循C++标准,因此会报错阻止这种写法。不过GCC可以通过开启-fpermissive编译选项放宽检查,允许该非标准语法;Clang也有类似的扩展开关,但默认处于禁用状态。
内容的提问来源于stack exchange,提问作者SebastianWilke
相关产品推荐
相关产品推荐

