我有以下代码:
typedef struct Y {int X;} X;
enum E {X};
会产生错误:
错误:'X'重新声明为不同类型的符号
据我所知,C隐式定义了结构,联合和枚举标记以及它们的成员的名称空间。所以,我不确定为什么E::X
会与typedef结构标记X
发生冲突?
C中的名称空间究竟是什么?
答案 0 :(得分:5)
C没有enum
成员的单独命名空间。当您编写enum {X}
时,会创建一个全局常量X
(可能会与其他全局名称冲突,例如typedef
'd标记)。
答案 1 :(得分:0)
因为类型X
是在全局命名空间中声明的,然后包含enum E
,反过来又包含X
的重新声明。所以这发生是因为它们不在同一级别 - 一个“命名空间”包含另一个。