struct和union name碰撞

时间:2017-07-31 06:27:14

标签: c struct unions

我写了一个简单的测试程序并尝试使用它:

union FLT { ... };
struct FLT { ... };

但编译器抱怨命名冲突。

在C语言中,您需要使用structunion作为标记名称,为什么它们会发生冲突?

我的意思是,当我们要声明一个名为stuct FLT的{​​{1}}类型的变量时,我们会使用

num

当我们想要使用struct FLT num; 类型的diffnum变量时,我们会使用

union FLT

那么为什么编译器无法区分它们呢?

顺便说一下,如果你需要知道,我测试了MinGW和VC。

更新

union FLT diffnum;

我正在使用此代码进行一些浮点运算测试。

1 个答案:

答案 0 :(得分:7)

他们发生碰撞,因为所有"标记类型"为标签共享一个命名空间。

C11 6.2.3 Name spaces of identifiers (N1570 Draft)

  

如果可以看到多个特定标识符的声明   在翻译单元中的任何一点,句法上下文消除歧义   用于指代不同实体的用途。因此,有单独的名称   各类标识符的空格如下:

     
      
  • 标签名称(通过标签声明和使用的语法消除歧义);
  •   
  • 结构,联合和枚举的标记(通过遵循任何关键字struct,union或enum来消除歧义);
  •   
  • 结构或工会的成员;每个结构或联合为其成员都有一个单独的名称空间(根据类型的歧义消除歧义)   用于通过访问成员的表达式。或 - >操作者);
  •   
  • 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。
  •