在C中嵌套结构

时间:2014-01-28 15:29:41

标签: c struct

我是C的菜鸟,需要一些帮助才能让我的代码......欢迎......做任何事情。我将以下内容放入.h文件中。

typedef struct
{
    int active; 
    int dead;
    ucontext_t t;
    struct node *link;
}gtthread_t;

struct node{
   struct gtthread_t thread;
};

typedef struct
{
int rubic;
}gtthread_mutex_t;

这是一个.h文件......一个.h文件,我不得不#include ucontext.h ...我知道我也不应该这样做...但这是我能做的唯一方法访问ucontext_t,我发现。

所以,我的错误是“字段线程类型不完整”。

为什么呢?那有什么意思?如果我想在.h文件中使用那种数据声明结构,我怎么可能不能导入ucontext.h?

3 个答案:

答案 0 :(得分:2)

与您的其他内容无关。这与您的第一个结构是匿名的并且类型名称为gtthread_t的事实有关。与C ++不同,C区分gtthread_tstruct gtthread_t

命名结构:

struct gtthread_t
{
    int active; 
    int dead;
    ucontext_t t;
    struct node *link;
};

或者将类型名称更改为typedef:

struct node{
   gtthread_t thread;
};

答案 1 :(得分:0)

ucontext.h标头仅预先声明ucontext_t类型。你只应该使用指针,因为它的大小是未知的。将您的代码更改为:

ucontext_t *t;

你会没事的。请注意,ucontext.h标头中的所有函数都使用此类指针来引用上下文。这在C API设计中很常见,因为它允许将表示隐藏在API的实现中,这很好。

答案 2 :(得分:0)

一个问题是struct node尚未宣布,因此gtthread_t类型无法完成。

typedef struct
{
    int active; 
    int dead;
    ucontext_t t;
    struct node *link;        
}gtthread_t;

struct node{
   struct gtthread_t thread;
};

您需要struct node的正向声明:

struct node;

typedef struct
{
    int active; 
    int dead;
    ucontext_t t;
    struct node *link;        
}gtthread_t;

struct node{
   struct gtthread_t thread;
};

尝试一下,看看它是否有所作为。