为什么以下是合法的:

typedef struct a aType;
struct a
{
   int x;
   aType *b;
};

以及以下非法行为:
void main()
{
    typedef struct a aType;
    aType someVariable;
    struct a
    {
      int x;
      aType *b;
    };
}

我只是好奇,因为在每种情况下,它都是正向引用,据我所知,至少对于函数和变量,正向引用是不合法的。
同样,C++的答案也一样吗?

最佳答案

就这样:

typedef struct a aType;
struct a { int x; aType *b; };

同:
struct a;
typedef struct a aType;
struct a { int x; aType *b; };

因此,您将向前声明一个structtypedef并稍后定义它很好。
第二个例子:
typedef struct a aType;
aType someVariable;
struct a { int x; aType *b; };

这与它在本地范围无关。
正在发生的是:
struct a;
typedef struct a aType;
aType someVariable; // error: when it gets here, aType is still incomplete
struct a { int x; aType *b; };
aType someVariable; // perfectly fine, aType not incomplete

记住编译是按顺序进行的。当您试图声明someVariable时,编译器还不知道struct a是什么,所以它不知道它的大小,因此它不知道要为它分配多少内存,因此出现编译错误在定义了aType之后声明它可以正常工作。

10-07 15:33