2014-04-03 5 views
1
typedef struct { 
int Key_value; 
Node *link; 
}Node; 

Является ли указанное выше заявление действительным? или я должен использоватьСинтаксис типа typedef struct

typedef struct _node{ 
int Key_value; 
_node *link; 
}Node; 
+0

почему вы не обобщать и видеть ваше self ... – 51k

+0

Проверить http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c?rq=1 –

+1

C и C++ - это разные языки, пожалуйста, укажите, какие на вас. Я бы ожидал, что это будет примерно C. – unwind

ответ

4

Нет, это не действует (как вы заметили бы, если бы вы попытались собрать его).

Псевдоним typedef не вводится до после typedef, поэтому вы не можете использовать его внутри себя.

Второй недействителен (C), _node не является допустимым типом. Вы должны использовать struct _node для самостоятельной ссылки.

Я предпочитаю использовать предварительную декларацию и разделить его:

typedef struct Node Node; 

struct Node { 
    int Key_Value; 
    Node *link; 
}; 
+0

В C. В C++ ссылка '_node * link;' действительна. (Конечно, в C++ вы обычно не пишете это так.) –

+0

@JamesKanze Правильно, я не заметил, что вопрос был отмечен двумя тегами. – unwind

+0

Идентификаторы, такие как '_node' с лидирующим подчеркиванием, не должны использоваться в области файлов. –

1

Дело в том, что вы можете дать такое же имя, как к структуре и ЬурейеЕ:

typedef struct Node { 
    int Key_value; 
    struct Node *link; 
} Node; 

Здесь я добавили кое-что, из-за чего ваш код не будет компилироваться в компиляторе C: typedef не создается до после. Структура определена. Это означает, что мы должны использовать имя структуры в объявлении участника link.

Это может быть либо решена, давая структуру имя, как указано выше, или путем объявления typedef первым:

typedef struct Node *Node; 

struct Node { 
    int Key_value; 
    Node *link; 
}; 

отметить также, что в C++ вам не нужно использовать typedef ключевое слово, или struct ключевое слово при объявлении link члена:

// C++ version 
struct Node { 
    int Key_value; 
    Node *link; 
}; 

структуры (и класс) имена могут быть используемые в качестве типов в C++.

+0

у вас '' 'слишком много в вашем' typedef'. –

0

Первое объявление недействительно, так как Node не известно, когда вы объявляете link в качестве члена структуры. Причина в том, что имя декларации видно только после объявления (просто поставить, то есть после запятой, равным знаком или точкой с запятой). Итак, typedef является объявлением, как и любое другое, имя Node видно только после окончательной полуколонии, которая завершает заявление.

Таким образом, вы должны использовать вторую форму (первая даже не будет компилироваться). Однако, если вы на C, обратите внимание, что вы должны предварять struct ключевое слово _node, как это:

typedef struct _node { 
    int Key_value; 
    struct _node *link; 
} Node; 

Это не является необходимым, если вы на C++.

0

Оба недействительны. Вот один действительный способ, для C и C++:

struct Node 
{ 
    int Key_value; 
    struct Node *link; 
}; 


// if C, you can also do this 
typedef struct Node Node; 

Главное в том, что независимо от типа Link, оно должно быть что-то, что уже был объявлен .Строка struct X { .... заявляет, что struct X является типом (но еще не определяет его, но это нормально).

0

В C вы должны сделать:

typedef struct _node { 
    int Key_value; 
    struct _node *link; 
} Node; 

Однако, если вы используете C++, то проще опустить typedef вообще:

struct Node { 
    int Key_Value; 
    Node* link; 
} 
+0

Это не отвечает на вопрос. «Добавление» к другим ответам должно быть представлено в виде комментария. –

+0

@ FilipeGonçalves вы правы, ответ отредактирован, чтобы включить код C – Loghorn

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