为什么不将 1 个头文件包含到两个 CPP 文件中会导致重新定义错误?
Why doesn't including 1 header file into two CPP files cause a redefinition error?
假设我有一个这样的头文件:
ABC.h
class A {
int d = 5;
int e = 6;
};
然后我将 ABC.h 包含到两个源 CPP 文件中。那么当 linker link 编译单元在一起时,我不会得到 class A 的 2 个定义吗?但是为什么 linker 在我测试这个实验时没有抱怨呢?我很困惑。
我正在使用 Visual Studio 2017 进行编译。
这个问题有两种可能的答案。
- 没有错误,否则无法生成任何有用的程序。多个翻译单元中的这种重复 class 定义是正常的,并且在每个程序中都是预期的。因此,该语言的定义方式使其能够正常工作。
- 没有错误,因为此 class 定义不会创建任何可能导致多个定义错误的全局符号。全局符号通常由具有外部链接的非内联变量或函数的定义创建。此头文件中没有此类定义。 类 及其非静态成员没有链接。
假设我有一个这样的头文件:
ABC.h
class A {
int d = 5;
int e = 6;
};
然后我将 ABC.h 包含到两个源 CPP 文件中。那么当 linker link 编译单元在一起时,我不会得到 class A 的 2 个定义吗?但是为什么 linker 在我测试这个实验时没有抱怨呢?我很困惑。
我正在使用 Visual Studio 2017 进行编译。
这个问题有两种可能的答案。
- 没有错误,否则无法生成任何有用的程序。多个翻译单元中的这种重复 class 定义是正常的,并且在每个程序中都是预期的。因此,该语言的定义方式使其能够正常工作。
- 没有错误,因为此 class 定义不会创建任何可能导致多个定义错误的全局符号。全局符号通常由具有外部链接的非内联变量或函数的定义创建。此头文件中没有此类定义。 类 及其非静态成员没有链接。