【发布时间】:2011-09-17 23:58:08
【问题描述】:
当我看到以下代码在 g++-4.2 中编译时没有错误或警告时,我感到非常惊讶:
typedef enum test { one };
我的假设是,如果您使用 typedef 关键字,则需要一个额外的标识符,如下所示:
typedef enum test { one } test;
如前所述,g++-4.2 甚至在没有警告的情况下接受它。 Clang++ 3.0 警告“warning: typedef requires a name”,类似地 Comeau 警告“warning: declaration requires a typedef name”,g++-4.6 通知:“warning : 'typedef' 在此声明中被忽略"。
我无法确定标准中允许这样做的位置,而且我发现两个编译器警告它是必需,这有点令人困惑,如果它不应该是一个错误typedef-name 是必需的,但不存在?
更新:我使用相同的编译器检查了 C。 Clang 和 Comeau 产生相同的输出,gcc 给出警告:“warning: useless storage class specifier in empty declaration”,这似乎更令人困惑。
更新:我检查了删除枚举的名称,结果是一样的:
typedef enum { one };
与命名结构类似:
typedef struct named { int x };
但不是使用未命名的结构,在这种情况下,代码在 g++ (4.2/4.6) 中被拒绝,并显示“error: missing type-name in typedef-declaration”, gcc (4.2/4.6 ) 给出警告:“警告:未定义实例的未命名结构/联合”,clang++“警告:声明未声明任何内容”,comeau“错误:声明需要一个 typedef 名称"
【问题讨论】:
-
有趣,VS2010 也接受代码,没有任何警告/错误。
-
语法不是
typedef enum { one } test吗? -
是的,我认为这应该是一个错误。
-
@Radu:这是未命名枚举的语法,而不是这里要问的内容。
-
@0A0D:这使它成为非 C++ 的原因是什么?如果不是
typedef'd,我什至不需要枚举限定符。