typedef struct {
int Key_value;
Node *link;
}Node;
Является ли указанное выше заявление действительным? или я должен использоватьСинтаксис типа typedef struct
typedef struct _node{
int Key_value;
_node *link;
}Node;
typedef struct {
int Key_value;
Node *link;
}Node;
Является ли указанное выше заявление действительным? или я должен использоватьСинтаксис типа typedef struct
typedef struct _node{
int Key_value;
_node *link;
}Node;
Нет, это не действует (как вы заметили бы, если бы вы попытались собрать его).
Псевдоним typedef
не вводится до после typedef
, поэтому вы не можете использовать его внутри себя.
Второй недействителен (C), _node
не является допустимым типом. Вы должны использовать struct _node
для самостоятельной ссылки.
Я предпочитаю использовать предварительную декларацию и разделить его:
typedef struct Node Node;
struct Node {
int Key_Value;
Node *link;
};
В C. В C++ ссылка '_node * link;' действительна. (Конечно, в C++ вы обычно не пишете это так.) –
@JamesKanze Правильно, я не заметил, что вопрос был отмечен двумя тегами. – unwind
Идентификаторы, такие как '_node' с лидирующим подчеркиванием, не должны использоваться в области файлов. –
Дело в том, что вы можете дать такое же имя, как к структуре и ЬурейеЕ:
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++.
у вас '' 'слишком много в вашем' typedef'. –
Первое объявление недействительно, так как Node
не известно, когда вы объявляете link
в качестве члена структуры. Причина в том, что имя декларации видно только после объявления (просто поставить, то есть после запятой, равным знаком или точкой с запятой). Итак, typedef
является объявлением, как и любое другое, имя Node
видно только после окончательной полуколонии, которая завершает заявление.
Таким образом, вы должны использовать вторую форму (первая даже не будет компилироваться). Однако, если вы на C, обратите внимание, что вы должны предварять struct
ключевое слово _node
, как это:
typedef struct _node {
int Key_value;
struct _node *link;
} Node;
Это не является необходимым, если вы на C++.
Оба недействительны. Вот один действительный способ, для 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
является типом (но еще не определяет его, но это нормально).
В C вы должны сделать:
typedef struct _node {
int Key_value;
struct _node *link;
} Node;
Однако, если вы используете C++, то проще опустить typedef
вообще:
struct Node {
int Key_Value;
Node* link;
}
Это не отвечает на вопрос. «Добавление» к другим ответам должно быть представлено в виде комментария. –
@ FilipeGonçalves вы правы, ответ отредактирован, чтобы включить код C – Loghorn
почему вы не обобщать и видеть ваше self ... – 51k
Проверить http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c?rq=1 –
C и C++ - это разные языки, пожалуйста, укажите, какие на вас. Я бы ожидал, что это будет примерно C. – unwind