我不明白为什么我得到这个代码的编译错误?如果有人澄清它会有很大的帮助。c结构声明行为
int main()
{
struct xx
{
int x;
struct yy
{
int z;
struct xx *p;
};
struct yy *q;
};
}
我不明白为什么我得到这个代码的编译错误?如果有人澄清它会有很大的帮助。c结构声明行为
int main()
{
struct xx
{
int x;
struct yy
{
int z;
struct xx *p;
};
struct yy *q;
};
}
在C语言中,不允许在没有立即引入数据字段的情况下声明struct
类型在其他struct
类型中。即结构声明和数据字段声明应该在一个步骤中完成(作为一个声明)。你违反了这条规则:你的struct yy
定义只是在struct xx
定义之内,没有任何理由。
或者将struct yy
定义在struct xx
之外,或者确保struct yy
定义立即声明xx
的字段。
例如,这实现相同的目的,但是否正确
struct xx
{
int x;
struct yy
{
int z;
struct xx *p;
} *q; // `struct yy` definition is immediately used to declare field `q`
};
然而,通常在C语言中,我们没有理由来创建嵌套的结构定义。它通常是一个更好的主意,在同级别定义结构,没有任何嵌套
struct yy
{
int z;
struct xx *p;
};
struct xx
{
int x;
struct yy *q;
};
你为什么不这样做从一开始呀?在“嵌套”时尚中定义这些结构有什么意义?
您在语句struct xx* p
处缺少;
。
struct xx *p;
} *q
结构yy嵌套在结构xx中。因此,元素是可以通过结构xx的实例访问的,这需要知道yy的一个实例。如果在定义 结构之后创建实例,则编译器将不知道与xx相关的实例。因此,对于嵌套结构yy,您必须声明 成员。
什么是错误? – Mysticial 2012-07-09 05:13:28
请参阅http://ideone.com/2IzBd获取在gcc-4.3.4上编译的代码版本。 – 2012-07-09 05:34:46
@Brian L:这将表示由GCC以其默认配置实现的非标准编译器扩展。您的ideone代码在C89/90和C99都是非法的。 – AnT 2012-07-09 05:38:44