2012-07-09 120 views
0

我不明白为什么我得到这个代码的编译错误?如果有人澄清它会有很大的帮助。c结构声明行为

int main() 
{ 
    struct xx 
    { 
    int x; 
    struct yy 
    { 
    int z; 
    struct xx *p; 
    }; 
    struct yy *q; 
    }; 
} 
+3

什么是错误? – Mysticial 2012-07-09 05:13:28

+0

请参阅http://ideone.com/2IzBd获取在gcc-4.3.4上编译的代码版本。 – 2012-07-09 05:34:46

+0

@Brian L:这将表示由GCC以其默认配置实现的非标准编译器扩展。您的ideone代码在C89/90和C99都是非法的。 – AnT 2012-07-09 05:38:44

回答

2

在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; 
}; 

你为什么不这样做从一开始呀?在“嵌套”时尚中定义这些结构有什么意义?

+0

但是,在我给结构yy的代码后面是struct yy * q。这与你给出的不一样吗?这两种说法有什么区别? – Dhatri 2012-07-09 05:27:36

+0

@ vindhya:不,它不是“一样的”。同样,在C语言中,您不允许嵌套结构声明,除非您将它作为数据字段声明的一部分*。您必须在一个步骤中声明嵌套的结构和数据字段*。如果你不想这样做,不要尝试嵌套结构声明。 – AnT 2012-07-09 05:29:16

+0

你能解释一下数据字段声明和声明struct yy * q之间的区别么? – Dhatri 2012-07-09 05:31:04

0

您在语句struct xx* p处缺少;

struct xx *p; 
} *q 
0

结构yy嵌套在结构xx中。因此,元素是可以通过结构xx的实例访问的,这需要知道yy的一个实例。如果在定义 结构之后创建实例,则编译器将不知道与xx相关的实例。因此,对于嵌套结构yy,您必须声明 成员。