C中的结构和功能范围有什么区别?

C中的结构和功能范围有什么区别?,c,struct,C,Struct,考虑一下这段代码 int main(void) { typedef struct { int i; } s; struct { s s; } t; return 0; } 它编译得很好。现在看看这个 int main(void) { typedef struct { int i; } s;

考虑一下这段代码

   int main(void)
   {
       typedef struct {
           int i;
       } s;

       struct {
           s s;
       } t;

       return 0;
   }
它编译得很好。现在看看这个

   int main(void)
   {
       typedef struct {
           int i;
       } s;

       s s;
       return 0;
   }
此代码不会编译-

‘s’ redeclared as different kind of symbol.

问:为什么在结构中使用“s”作为声明是正确的,而在函数中使用此定义是不正确的?

作为
结构
成员,标识符
s
是明确的,因为在上面的示例中,您总是将其称为
somestruct.s
someptr->s
,成员
s
是结构的局部。如果不使用
t.s
语法,就不能使用它,因此与结构类型
s
没有冲突


在下例中,结构类型
s
和变量
s
在同一范围内,因此不清楚您指的是哪一个。

+1这很好。您认为c标准中会提到这些内容吗?@Mr.32是的,提到了。我认为它们实际上被称为标识符名称空间:“每个结构或联合都有一个单独的成员名称空间(通过.or->运算符访问成员时使用的表达式类型消除歧义);”(来自n1547)