您的位置:首页 > 其它

嵌套的结构体,枚举,及其他

2013-02-23 10:49 99 查看
这里说的嵌套,其实是在结构体里定义结构体及枚举。

需要重新考虑一下标识符的作用域,特别是块作用域。

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初始化和赋值的两个地方,均无法编译通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: