C++头文件添加防护宏仍出现重定义错误与#include警告该如何解决?
问题根因
1. #include多余标记警告
你的DoubleNode.cpp第一行代码末尾多写了分号:
#include "DoubleNode.hpp";
#include是预编译指令,不是C++语句,不需要末尾加分号,这个分号就是编译器提示的多余标记。
2. 重定义错误
你使用的是模板类,且已经在头文件末尾引入了DoubleNode.cpp的实现,这时候如果你把DoubleNode.cpp也作为独立源文件加入了编译队列,就会触发重定义:
- 单独编译
DoubleNode.cpp时,内部先引入DoubleNode.hpp,展开后会再次引入自身的全部实现代码,生成第一份符号 - 其他引用了
DoubleNode.hpp的业务源文件编译时,也会展开DoubleNode.cpp的全部代码,生成第二份重复符号
头文件的防护宏只能避免同一个编译单元内重复引入头文件,跨编译单元的重复定义防护宏无法生效,这就是你加了防护宏还报错的原因。
解决方案
- 第一步先删除
DoubleNode.cpp中#include "DoubleNode.hpp"末尾的分号,消除警告。 - 第二步任选以下一种方案解决重定义问题:
- 方案1:编译时不要把
DoubleNode.cpp加入源文件编译列表,只编译你的业务代码文件即可。模板类的实现已经全部通过头文件引入到业务代码中,不需要单独编译DoubleNode.cpp。 - 方案2:调整文件命名规则避免误操作,把
DoubleNode.cpp改名为DoubleNode.tpp或者DoubleNode.impl,同时修改头文件末尾的引入语句为#include "DoubleNode.tpp"(对应你修改后的后缀),这类后缀是模板实现文件的通用命名,不会被编译器默认当成普通源文件编译。 - 方案3:直接把
DoubleNode.cpp里的所有实现代码搬到DoubleNode.hpp的类定义后面,删掉单独的DoubleNode.cpp文件,这是模板类最常用的写法,不会有引入混淆问题。
- 方案1:编译时不要把
内容的提问来源于stack exchange,提问作者wchen2296
相关产品推荐
相关产品推荐

