C 结构声明行为

C 结构声明行为,c,C,我无法解释为什么我会在这段代码中出现编译错误?如果有人能澄清这一点,那将非常有帮助 int main() { struct xx { int x; struct yy { int z; struct xx *p; }; struct yy *q; }; } 您缺少在语句struct xx*p处 struct xx *p; } *q 结构yy嵌套在结构xx中。因此,要通过结构xx的实例访问yy的元素,结构xx需要已知yy的实例

我无法解释为什么我会在这段代码中出现编译错误?如果有人能澄清这一点,那将非常有帮助

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

您缺少
在语句
struct xx*p

  struct xx *p;
} *q

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

在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 yy后面跟着struct yy*q。这和你说的不一样吗?这两种说法有什么区别吗?@vindhya:不,不一样。同样,在C中,不允许嵌套结构声明,除非将其作为数据字段声明的一部分。您必须一步声明嵌套结构和数据字段。如果您不想这样做,请不要尝试嵌套结构声明。请您解释一下数据字段声明和语句结构yy*q之间的区别吗?@vindhya:没有区别<代码>结构yy*q
是数据字段声明。代码中的问题是
struct yy
本身的定义。它只是独自坐在那里。嵌套结构声明也不允许这样做。如果要单独声明结构类型,请以非嵌套方式进行。有关在gcc-4.3.4上编译的代码版本,请参阅。@Brian L:这表示gcc在其默认配置中实现的非标准编译器扩展。您的ideone代码在C89/90和C99中都是非法的。