首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C与C++中的类型定义结构

C与C++中的类型定义结构
EN

Stack Overflow用户
提问于 2015-08-09 19:12:37
回答 1查看 24.7K关注 0票数 20

这在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++的执行顺序,这样我就可以理解它了。

EN

回答 1

Stack Overflow用户

发布于 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_tstruct node_t来引用此结构类型。如果声明的类型名不存在,C++将在标记名中搜索类型名,因此不需要上面的双重定义,但不会有什么坏处。

在这两种语言中,在完全定义类型之前的任何时候都需要显式的struct node_t版本,因此任何自引用和任何前向引用都将使用struct版本。我更喜欢在头文件中这样做,主要是因为它减少了#include指令的顺序问题。

PS:这在任何一种语言中都有效(参见LRIO关于C++11标准指针的回答),并且已经在足够多的双语甚至纯C++头文件中使用,所以它是一种非常简单的方法,只适用于任何一种语言。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31903594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档