C中的结构和函数范围有什么区别?
问题描述:
考虑这段代码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秒;”作为一个结构内的声明,但不正确的定义在函数内?
答
上部示例成员s
是本地结构。如果不使用t.s
语法,则不能使用它,因此与结构类型s
没有冲突。
在较低示例结构类型s
和变量s
处于相同范围内,所以您不清楚您指的是哪一个。
答
作为struct
的成员,标识s
是明确的,因为您始终将其定址为somestruct.s
或someptr->s
。
+1其良好。你认为这件事会在C标准中提到吗? –
@ Mr.32是的,他们被提及。我认为它们实际上被称为标识符名称空间:*“每个结构或联合体的成员都有一个单独的名称 空间(用于通过。或 - >运算符访问 成员的表达式的类型消歧)”* (从1547年起) – user694733