2016-03-25 1 views
0

Я пробовал некоторые базовые материалы для создания данных в C. И я возвращаюсь на C после долгого времени. Вот мой простой struct:Неизвестная ошибка имени типа в C

typedef struct 
{ 
    int data; 
    LLNode *next; //Error: unknown type name 'LLNode' 
}LLNode; 

Но это дает ошибку компиляции, как показано выше. Это потому, что при компиляции struct компилятор не знает о существовании LLNode? Это означает, что я должен сначала объявить LLNode до struct. Это так? Если да, то как я должен это делать?

ответ

4

ли это таким образом:

typedef struct LLNode LLNode; 

struct LLNode { 
    int data; 
    LLNode *next; //No error 
}; 

Вы не можете использовать LLNode типа, прежде чем она определена. С помощью этого метода вы сначала заявляете, что такое LLNode. Несмотря на то, что struct LLNode еще не определен, это объявление достаточно для объявления LLNode * членов (но вы еще не смогли объявить член LLNode), поскольку размер указателя не зависит от типа указателя.

+0

Вы могли бы хотеть добавить объяснение, почему это работает, для полноты изложения. – Cubic

+1

@ Кубик Вы правы. Готово. – jdarthenay

6

Элемент данных next конструкции объявлен тип LLNode, что неизвестно.

Исправленный пример

typedef struct LLNode 
{ 
    int data; 
    struct LLNode *next; //Error: unknown type name 'LLNode' 
}LLNode; 

Примите во внимание, что имя тега структура и имя ЬурейеЕ находятся в разных пространствах имен. Таким образом, вы можете использовать эти два имени одновременно, например, struct LLNode и только LLNode.

2

typedef является неполным до конца, поэтому LLNode не доступен как имя типа внутри struct. Однако structтег будет доступен, так что вы можете сделать это:

typedef struct LLNode 
{ 
    int data; 
    struct LLNode *next; 
} LLNode; 

Это производит struct с одинаковой структурой с тем, что в вашем посте, потому что struct LLNode является typedef -ed к LLNode.

+0

Как это соотносится с определением 'typedef' перед' struct', как объясняется @jdarthenay в ответе ниже? – Mahesha999

+0

@ Mahesha999 Это вопрос предпочтения. Ваше определение 'struct' не зависит от' typedef', вы можете объединить их или разделить их по своему усмотрению; это не имеет значения для компилятора, если он видит их обоих. Еще одна возможность - сначала определить 'struct' без' typedef', а затем добавить 'typedef struct LLNode LLNode' в конце. Эффект будет одинаковым во всех трех случаях. – dasblinkenlight

0

вы можете использовать:

typedef struct LLNode LLNode; 
struct LLNode 
{ 
int data; 
LLNode *next; 
}; 
+0

Эй, вы должны использовать встроенный вводщик кода, как то, что вы видите выше в других ответах, вместо того, чтобы отображать его, как вы уже выше. Нажмите кнопку «{}», чтобы добавить код таким образом. –