头文件中类的成员函数在两个CPP文件实现会触发编译错误吗?
类成员函数在多个CPP文件重复实现的后果
这种情况编译阶段不会触发错误,但链接阶段会报错,具体原因如下:
- 编译器独立处理每个源文件:编译
A1.cpp时,会生成包含A::funcA定义的目标文件;编译A2.cpp时同理,也会生成包含该函数定义的目标文件。两个文件的编译过程互不干扰,因此编译器不会报错。 - 链接阶段会校验全局符号唯一性:链接器需要将所有目标文件合并为最终可执行文件,此时发现
A::funcA这个符号存在多个定义,违反了C++的单定义规则(ODR),会抛出类似multiple definition of 'A::funcA()'的错误。
示例代码:
// 头文件 A.hpp class A { public: int funcA(); }; // 实现文件 A1.cpp #include "A.hpp" int A::funcA(){/* 任意实现 */} // 实现文件 A2.cpp #include "A.hpp" int A::funcA(){/* 任意实现 */}
内容的提问来源于stack exchange,提问作者Liviu Dorobantu
相关产品推荐
相关产品推荐

