我正在尝试将一些编译好的代码作为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相同的行为?
或者,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)
自引用类型在 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何时使用的“普通”形式重新流行起来。
| 归档时间: |
|
| 查看次数: |
318 次 |
| 最近记录: |