如何在C语言中前向声明结构体

3

我想要将父结构和子结构进行双向链接。在C++中,我知道这是可行的。

struct child;

struct parent{
   child* c;
} ;

struct child{
   parent* p;
} ;

但在C语言中,使用typedef时我无法避免警告出现。

struct child;

typedef struct {
    struct child* c;
} parent;

typedef struct {
    parent* p;
} child;

int main(int argc, char const *argv[]){
    parent p;
    child c;
    p.c = &c;
    c.p = &p;
    return 0;
}

这个错误提示信息是“warning: assignment to ‘struct child *’ from incompatible pointer type ‘child *’”。第一个子结构体被覆盖了吗?还是现在有两个不同的数据结构,即struct childchild

C语言中是否可能发生这种情况呢?我的第二个想法是使用void*,并将其转换为child类型,但是到目前为止,这两种选项都让我感到不爽。


尝试使用typedef struct child { ... } child;。否则编译器无法连接两者。 - dxiv
奇怪的是,新版本的gcc在没有任何警告的情况下接受了你的代码。 - Jean-François Fabre
@Jean-FrançoisFabre 这里有一个相当强烈的警告链接 - dxiv
一点免费的建议:不要在C语言中使用typedef来定义结构体。C语言没有类,放弃试图让东西看起来像类的想法,只需明确地在任何地方使用struct关键字即可。typedef只会隐藏重要信息。typedef指向结构体的指针甚至更糟。 - Zan Lynx
3个回答

4
你可以先声明结构体,然后稍后再使用typedef定义它们:
struct child {
    struct parent* p;
};

struct parent {
    struct child* c;
};

typedef struct parent parent;
typedef struct child child;

int main(int argc, char const *argv[]){
    parent p;
    child c;
    p.c = &c;
    c.p = &p;
    return 0;
}

3
问题在于您有两个不同的结构。第一个结构是:
struct child;

第二个变量是一个没有命名的结构体,其别名为child

typedef struct {
    parent* p;
} child;

你需要编写代码

typedef struct child {
    parent* p;
} child;

@RobertHarvey 最初在问题中假定结构体child将具有别名child的名称。 - Vlad from Moscow

0
你可以像这样声明结构体:
typedef struct parent {
    struct child* c;
}parent;

typedef struct child {
    parent* p;
}child;

int main(int argc, char const *argv[])
{
     parent p;
     child c;
     p.c = &c;
     c.p = &p;
     return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接