c中的自引用结构

use*_*293 4 c struct

我正在尝试将一些编译好的代码作为C++在VS2010中编译为c(gcc c99)并且我遇到了编译错误.它与其他自引用结构问题略有不同,因为我有2个用户定义的类型,每个类型都包含指向彼此的指针.看来我的前瞻性声明还不够.

struct potato; //forward declare both types
struct tomato;

struct potato
{
    potato* pPotato; //error: unknown type name ‘potato’
    tomato* pTomato;

};

struct tomato
{
    potato* pPotato;
    tomato* pTomato;
};
Run Code Online (Sandbox Code Playgroud)

为什么这不适用于gcc 99?为什么它可以作为C++代码?我应该如何修改它以获得与c99相同的行为?

art*_*rtm 8

或者,typedef他们两个

typedef struct potato potato; //forward declare both types
typedef struct tomato tomato;

struct potato
{
    potato* pPotato;
    tomato* pTomato;

};

struct tomato
{
    potato* pPotato;
    tomato* pTomato;
};
Run Code Online (Sandbox Code Playgroud)


Dai*_*Dai 5

自引用类型在 C 中有效,但在 Cstruct中与变量/常量位于不同的命名空间中,并且在使用struct它们的名称时必须加上前缀。

另外,避免使用匈牙利符号,在您的情况下是p前缀。

尝试这个:

struct potato; //forward declare both types
struct tomato;

struct potato
{
    struct potato* potato;
    struct tomato* tomato;

};

struct tomato
{
    struct potato* potato;
    struct tomato* tomato;
};
Run Code Online (Sandbox Code Playgroud)

避免必须不断输入的传统方法struct foo是使用typedef:

typedef struct potato potato;
Run Code Online (Sandbox Code Playgroud)

的定义struct potato可以匿名和内联使用:

typedef struct { ... } potato;
Run Code Online (Sandbox Code Playgroud)

我个人观察到,使用typedef struct似乎正在下降,并且使用始终指定struct何时使用的“普通”形式重新流行起来。