这在C++中给出了一个错误,但在C:
typedef struct nodes
{
int data;
struct node *next;
}node;
它在C++中显示以下错误。
/home/DS cpp/linkedlist.cpp|10|error: conflicting declaration ‘typedef struct nodes node’|
/home/DS cpp/linkedlist.cpp|9|error: ‘struct node’ has a previous declaration as ‘struct node’|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
为了让它在C++中工作,我必须将其更改为:
typedef struct node
{
int data;
struct node *next;
}node;
我不明白为什么会发生这种情况,我想知道C和C++的执行顺序,这样我就可以理解它了。
发布于 2015-08-09 19:38:02
您给出的C示例应该是错误的。您正在使用一个尚未使用struct node
定义的标记名(node
)。
考虑到这两个选择,第二个是要使用的。我更喜欢经济一点的:
typedef struct node_t
{
int data;
struct node_t *next;
} node_t;
在C或C++中,标记名称有自己的名称空间,因此使用相同的名称作为标记和类型定义名称是没有问题的。在C中,这允许您使用node_t
或struct node_t
来引用此结构类型。如果声明的类型名不存在,C++将在标记名中搜索类型名,因此不需要上面的双重定义,但不会有什么坏处。
在这两种语言中,在完全定义类型之前的任何时候都需要显式的struct node_t
版本,因此任何自引用和任何前向引用都将使用struct
版本。我更喜欢在头文件中这样做,主要是因为它减少了#include
指令的顺序问题。
PS:这在任何一种语言中都有效(参见LRIO关于C++11标准指针的回答),并且已经在足够多的双语甚至纯C++头文件中使用,所以它是一种非常简单的方法,只适用于任何一种语言。
https://stackoverflow.com/questions/31903594
复制相似问题