代码之家  ›  专栏  ›  技术社区  ›  m0h4mm4d

结构和联合名称冲突

  •  3
  • m0h4mm4d  · 技术社区  · 7 年前

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

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

    但编译器抱怨命名冲突。

    struct union 在标记名之前,它们为什么会碰撞?

    我的意思是当我们想要声明一个类型为 stuct FLT 已命名 num 我们会使用

    struct FLT num;
    

    当我们想使用一个名为 diffnum 类型 union FLT

    union FLT diffnum;
    

    那么为什么编译器不能区分它们呢?

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

    union FLOAT {
            float value;
            unsigned int bits;
            unsigned char bytes[4];
    };
    struct FLOAT {
            unsigned int sign;
            unsigned int exponent;
            unsigned int significand;
    };
    union FLOAT num;
    struct FLOAT num_parts;
    

    我用这段代码做了一些浮点算术测试。

    1 回复  |  直到 7 年前
        1
  •  7
  •   StoryTeller - Unslander Monica    7 年前

    C11 6.2.3 Name spaces of identifiers (N1570 Draft)

    翻译单元中的任何一点,句法语境都会消除歧义 各类标识符的空间,如下所示:

    • 标签名称(通过标签声明和使用的语法消除歧义);
    • (通过遵循任何关键字struct、union或enum来消除歧义);
    • 结构或工会的成员;每个结构或联合都有其成员的单独名称空间(通过 用于通过.或访问成员的表达式->运营商);