首页 > 解决方案 > 为什么C/C++结构体类型可以在不同的文件中重新定义,但是变量和函数却报错?

问题描述

测试1.cpp:

struct ListNode
{
    int       m_nValue;
    ListNode* m_pNext;
};

测试2.cpp:

 struct ListNode
 {
     int       m_nValue;
     ListNode* m_pNext;
 };

ps:test1.cpp和test2.cpp是同一个项目,运行正常。

但是,test1.cpp:

int a;

测试2.cpp:

int a;

将被重新定义,错误。

struct ListNode
{
    int       m_nValue;
    ListNode* m_pNext;
};

如果只是声明,而不是定义,为什么

测试.cpp:

 struct ListNode
  {
       int       m_nValue;
       ListNode* m_pNext;
  };
 struct ListNode
  {
       int       m_nValue;
       ListNode* m_pNext;
  };

被重新定义?

有什么区别

struct ListNode;
struct ListNode;
struct ListNode{};

他们都只是声明吗?

标签: c++c

解决方案


基本上因为结构实际上只是编译时的东西,结构定义本身不会传递给链接器。

另一方面,全局变量和静态变量需要传递给链接器,链接器检查所有内容是否只有一个定义(它强制执行一个定义规则)。

但请注意结构,即使您可以在多个翻译单元中定义结构,定义也必须是逐个字符的精确匹配。如果不是,那么您将有未定义的行为


推荐阅读