嵌套的结构体,枚举,及其他
2013-02-23 10:49
99 查看
这里说的嵌套,其实是在结构体里定义结构体及枚举。
需要重新考虑一下标识符的作用域,特别是块作用域。
两个@之间并不是一个块作用域。
所以,
上述代码是合法的,s1,e0,E00,E01的作用域都是文件作用域,而不被struct s0所限制。
而,
上述代码是非法的,s1,e0,E00,E01的作用域都是基于函数abc所对应的块作用域。
下面的代码,
m1处无法编译通过是显而易见的,而在m0处,gcc下是可以编译通过的(vc下无法编译通过)。
gcc的做法可能是最后统一分配全局变量的空间,扫描到m0处时,只需记住这是一个结构体,大小未知,等看到s的定义时就可以确定其大小。
而,
对m初始化和赋值的两个地方,均无法编译通过。
需要重新考虑一下标识符的作用域,特别是块作用域。
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; int main(int argc, char *argv) { struct s m1; } struct s { int a; } ;
m1处无法编译通过是显而易见的,而在m0处,gcc下是可以编译通过的(vc下无法编译通过)。
gcc的做法可能是最后统一分配全局变量的空间,扫描到m0处时,只需记住这是一个结构体,大小未知,等看到s的定义时就可以确定其大小。
而,
struct s m = {1}; int main(int argc, char *argv) { m.a = 2; } struct s { int a; } ;
对m初始化和赋值的两个地方,均无法编译通过。
相关文章推荐
- 枚举变量输出与结构体嵌套初始化
- 指针运算、指针函数、函数指针、结构体指针以及枚举的介绍
- Swift的结构体,枚举,可选Optional,可选链
- 黑马程序员——4、C语言(结构体、枚举)
- C#中的结构体(Struct)和枚举(enum)的区别
- 通过ItemDataBound事件操作数据控件中嵌套的其他控件
- 结构体枚举的小结
- C语言(结构体、枚举、typedef)笔记 by STP
- Swift学习之路 -- 枚举和结构体
- 结构体,联合体union,枚举,sizeof
- 结构体嵌套二级指针
- C的结构体和其他数据形式
- C语言基础之结构体、枚举
- 枚举与结构体
- Swift-枚举、结构体、协议
- swift学习笔记之---数组、字典、枚举、结构体
- RecyclerView中嵌套RecyclerView或其他可滑动布局抢占焦点的问题
- 嵌入式开发第9天(结构体,枚举,共同体,typedef)
- Swift 类,结构体,枚举使用总结
- NDK探究之旅《六》—函数的指针、结构体、枚举、宏定义