【问题标题】:Why doesn't including 1 header file into two CPP files cause a redefinition error?为什么不将 1 个头文件包含在两个 CPP 文件中会导致重新定义错误?
【发布时间】:2019-02-11 03:18:03
【问题描述】:

假设我有一个这样的头文件:

ABC.h

class A {
    int d = 5;
    int e = 6;
};

然后我将 ABC.h 包含到两个源 CPP 文件中。那么当链接器将编译单元链接在一起时,我最终会得到 2 个 A 类的定义吗?但是为什么当我测试这个实验时链接器没有抱怨呢?我很困惑。

我正在使用 Visual Studio 2017 进行编译。

【问题讨论】:

  • 一个类的多个定义(以不同的单位)是允许的,只要它们完全相同。类没有链接,内联成员函数可以工作,因为它们是内联的
  • 尝试在不同的地方定义方法两次,看看会发生什么。

标签: c++ header-files redefinition


【解决方案1】:

这个问题有两种可能的答案。

  1. 没有错误,否则就不可能产生任何有用的程序。在多个翻译单元中重复的类定义是正常的,并且在每个程序中都是预期的。因此,该语言的定义方式使其能够正常工作。
  2. 没有错误,因为此类定义没有创建任何可能导致多个定义错误的全局符号。全局符号通常由具有外部链接的非内联变量或函数的定义创建。这个头文件中没有这样的定义。类及其非静态成员没有链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多