我正在尝试将一些在VS2010中编译为C ++的代码移动到c(gcc c99)并且我遇到了编译错误。它与其他自引用结构问题略有不同,因为我有2个用户定义的类型,每个类型都包含指向彼此的指针。看来我的前瞻声明还不够。
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(MID(A1,1,SEARCH(" ",A1,1)),1,""),2,""),3,""),4,""),5,""),6,""),7,""),8,""),9,""),0,"")
为什么这在gcc 99中不起作用?为什么它可以作为C ++代码?我应该如何修改它以获得与c99相同的行为?
答案 0 :(得分: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;
};
答案 1 :(得分:4)
自引用类型在C中有效,但在C struct
中存在于变量/常量的不同名称空间中,并且在使用其名称时必须以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;
};
避免不断输入struct foo
的传统方法是使用typedef
:
typedef struct potato potato;
struct potato
的定义可以匿名和内联使用:
typedef struct { ... } potato;
我个人观察到typedef struct
的使用似乎在下降并使用" longhand"使用时始终指定struct
的形式重新流行。
答案 2 :(得分:1)
你需要
struct potato
{
struct potato* pPotato;
struct tomato* pTomato;
};
Plain C不会自动输入结构。
就个人而言,我喜欢自动typedefing(我用一个简短的posfix来表示typedef是一个结构)所以我一直在用宏来模拟它:
#define Struct(Nam,...) typedef struct Nam Nam; struct Nam __VA_ARGS__
Struct(tomato,);
Struct(potato,);
Struct( potato, {
potato* pPotato; //error: unknown type name ‘potato’
tomato* pTomato;
});
Struct(tomato, {
potato* pPotato;
tomato* pTomato;
});
tomato tom;
potato pot;