c结构声明行为

时间:2012-07-09 05:11:31

标签: c

我无法理解为什么我的代码出现编译错误?如果有人澄清它会有很大的帮助。

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

3 个答案:

答案 0 :(得分: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定义。在没有任何嵌套

的情况下,在同一级别定义结构通常是更好的主意
struct yy
{
  int z;
  struct xx *p;
};

struct xx
{
  int x;
  struct yy *q;
};

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

答案 1 :(得分:0)

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

  struct xx *p;
} *q

答案 2 :(得分:0)

结构yy嵌套在结构xx中。因此,yy的元素将通过结构xx的实例访问,结构xx需要知道yy的实例。如果在定义后创建实例 结构编译器不会知道相对于xx的实例。因此,对于嵌套结构,你必须这样做 宣布成员。