2014-01-28 4 views
1

Я ноб у C и мне нужна помощь, чтобы мой код ... хорошо ... сделал что-нибудь. У меня есть следующий файл .h.Вложенные структуры в C

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, я нахожу.

Итак, моя ошибка здесь «полевая резьба имеет неполный тип».

Почему? Что это вообще значит? И как я могу, возможно, НЕ импортировать ucontext.h, если я хочу объявить структуры с такими типами данных в файле .h?

ответ

2

Не имеет никакого отношения к вашему другому. Это связано с тем, что ваша первая структура анонимна и имеет имя типа gtthread_t. C в отличие от C++ различает gtthread_t и struct gtthread_t.

Либо имя-структуру:

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

Или изменить имя типа в ЬурейеЕ:

struct node{ 
    gtthread_t thread; 
}; 
+0

Woooww ... не понимал, что это различает эти два. Я решил изменить typename на typedef. Загади меня это, хотя - как я могу получить доступ к узлу для потоковой передачи данных потока? node-> резьбовых> активный? Например? – PinkElephantsOnParade

+0

поскольку 'thread' не является указателем, к которому вы хотели бы получить доступ, например' node-> thread.active' (предполагая, что 'node' является указателем на' struct node'). В C 'a-> b' эквивалентно' (* a) .b' –

0

Заголовок ucontext.h только предварительно объявляет тип ucontext_t. Вы должны использовать только указатели, так как его размер неизвестен. Измените свой код на:

ucontext_t *t; 

и все будет в порядке. Обратите внимание, что все функции в заголовке ucontext.h используют такие указатели для обозначения контекстов. Это распространено в дизайне C API, поскольку оно позволяет скрывать представление внутри имплантации API, что приятно.

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; 
}; 

Try, что и посмотреть, если это делает разницу.

Смежные вопросы