为什么可以将typedef名称用作结构成员的名称?

问题描述 投票:6回答:2

我刚刚发现gccclang都接受以下代码:

typedef int blah;
struct s { char blah; };

但是,由于类型名称被用作标识符,他们拒绝这样做:

typedef int blah;
char blah;

这是否意味着在结构定义中看不到typedef的名称?不,因为这对gcc和clang都有效:

typedef int blah;
struct s { blah blah; }

我正在查看C99标准,找不到任何可以阐明为什么可以将typedef名称用作结构成员的名称,但不能用作同一范围内变量的名称的任何东西。

有人可以解释为什么会这样吗?对任何适用标准的参考将不胜感激。

c struct scope typedef
2个回答
8
投票

结构成员和普通变量位于不同的名称空间中。这就是为什么具有两个具有相同标识符名称的普通变量会失败,而如果在struct成员中使用相同的标识符名称并且一个普通变量很好的原因。]

C标准定义了不同的名称空间:

6.2.3 Name spaces of identifiers

如果在以下位置可以看到一个以上的特定标识符声明,翻译单元中的任何一点,句法语境都会消除歧义引用不同实体的用途。因此,有单独的名称各种类别的标识符的空格,如下所示:

  • 标签名称(通过标签声明和使用的语法消除了歧义;]]
  • 关键字struct,union或enum的结构,联合和枚举的标记(通过遵循any32消除歧义);
  • 结构或工会的成员;每个结构或联合会为其成员都有一个单独的名称空间(按名称的类型来区分)表达式,用于通过来访问成员。或->运算符);
  • 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明。)>
  • ((最后两个公告直接解决了这个问题)

    是,typedef的标识符与普通标识符共享名称空间。 6.7.8 Type definitions

[...] typedef名称与普通声明符中声明的其他标识符共享相同的名称空间。

从这里拍摄:https://www.spinellis.gr/cscout/doc/name.html

C具有4个不同的名称空间。这些不是C ++中的名称空间,可以使用关键字namespace访问这些名称空间。相反,这些是符号的单独区域:

  • 结构体/联合体/枚举的标签

  • struct / union的成员(实际上,为每个struct / union分配了一个单独的命名空间)

  • 标签

  • 普通标识符(在C标准中为对象)


  • 2
    投票

    从这里拍摄:https://www.spinellis.gr/cscout/doc/name.html

    C具有4个不同的名称空间。这些不是C ++中的名称空间,可以使用关键字namespace访问这些名称空间。相反,这些是符号的单独区域:

    © www.soinside.com 2019 - 2024. All rights reserved.