c中的自引用结构

时间:2016-12-02 23:20:14

标签: c struct

我正在尝试将一些在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相同的行为?

3 个答案:

答案 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;