2013-11-21 53 views
5

考虑这段代码C中的结构和函数范围有什么区别?

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秒;”作为一个结构内的声明,但不正确的定义在函数内?

回答

6

上部示例成员s是本地结构。如果不使用t.s语法,则不能使用它,因此与结构类型s没有冲突。

在较低示例结构类型s和变量s处于相同范围内,所以您不清楚您指的是哪一个。

+0

+1其良好。你认为这件事会在C标准中提到吗? –

+1

@ Mr.32是的,他们被提及。我认为它们实际上被称为标识符名称空间:*“每个结构或联合体的成员都有一个单独的名称 空间(用于通过。或 - >运算符访问 成员的表达式的类型消歧)”* (从1547年起) – user694733

3

作为struct的成员,标识s是明确的,因为您始终将其定址为somestruct.ssomeptr->s

相关问题