我写了一个简单的测试程序并尝试使用它:
union FLT { ... };
struct FLT { ... };
但编译器抱怨命名冲突。
在C语言中,您需要使用struct
和union
作为标记名称,为什么它们会发生冲突?
我的意思是,当我们要声明一个名为stuct FLT
的{{1}}类型的变量时,我们会使用
num
当我们想要使用struct FLT num;
类型的diffnum
变量时,我们会使用
union FLT
那么为什么编译器无法区分它们呢?
顺便说一下,如果你需要知道,我测试了MinGW和VC。
更新
union FLT diffnum;
我正在使用此代码进行一些浮点运算测试。
答案 0 :(得分:7)
他们发生碰撞,因为所有"标记类型"为标签共享一个命名空间。
C11 6.2.3 Name spaces of identifiers (N1570 Draft)
如果可以看到多个特定标识符的声明 在翻译单元中的任何一点,句法上下文消除歧义 用于指代不同实体的用途。因此,有单独的名称 各类标识符的空格如下:
- 标签名称(通过标签声明和使用的语法消除歧义);
- 结构,联合和枚举的标记(通过遵循任何关键字struct,union或enum来消除歧义);
- 结构或工会的成员;每个结构或联合为其成员都有一个单独的名称空间(根据类型的歧义消除歧义) 用于通过访问成员的表达式。或 - >操作者);
- 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。