这里说的嵌套,其实是在结构体里定义结构体及枚举。
需要重新考虑一下标识符的作用域,特别是块作用域。
struct s0
{ // @
int a;
}; // @
int main(int argc, char *argv)
{
}
两个@之间并不是一个块作用域。
所以,
struct s0
{
struct s1
{
int a;
} m;
enum e0
{
E00,
E01
} mm;
int a;
};
int main(int argc, char *argv)
{
struct s1 s;
s.a = EE0;
}
上述代码是合法的,s1,e0,E00,E01的作用域都是文件作用域,而不被struct s0所限制。
而,
void abc(void)
{
struct s1
{
int a;
} m;
enum e0
{
E00,
E01
} mm;
int a;
}
int main(int argc, char *argv)
{
struct s1 s;
s.a = EE0;
}
上述代码是非法的,s1,e0,E00,E01的作用域都是基于函数abc所对应的块作用域。
下面的代码,
struct s m0;
C语言中嵌套结构体与枚举的作用域解析

本文探讨了C语言中结构体内的嵌套结构体和枚举的作用域问题。强调了标识符的作用域并非由包含它们的结构体决定,而是遵循文件作用域和块作用域的规则。同时,分析了不同编译器对于未声明结构体类型的变量处理方式的差异,以及初始化和赋值时可能遇到的编译问题。
最低0.47元/天 解锁文章
4769

被折叠的 条评论
为什么被折叠?



