C++跨文件使用另一文件的const pair出现重定义错误如何解决
错误原因
- 头文件未添加包含保护:
S.hpp中没有设置头文件包含防护,当多个文件引入S.hpp时,内部定义的def1、def2常量会被多次展开,触发重定义报错。 - 主文件错误引入实现文件:主函数中直接
#include "R.cpp"和#include "S.cpp",会把两个实现文件的全部内容合并到主函数的编译单元,进一步重复引入头文件定义,放大重定义问题。 - 存在语法错误:主函数中
s是shared_ptr类型,不能直接用.调用成员方法,需要用->。
修复方案
- 给所有头文件添加包含保护:可以在头文件首行添加
#pragma once(编译器通用),或者使用传统的宏防护格式:#ifndef S_HPP #define S_HPP // 头文件原有内容 #endif - 调整常量定义方式:
如果使用C++17及以上版本,直接在头文件的const常量前加inline关键字,允许多个编译单元存在同一定义:
如果使用C++17以下版本,把头文件中的常量定义改为extern声明:inline const conf def1 = std::make_pair(10, 2); inline const conf def2 = std::make_pair(20, 4);// S.hpp中写声明 extern const conf def1; extern const conf def2; // 在S.cpp中给出唯一实现 const conf n1::n2::def1 = std::make_pair(10, 2); const conf n1::n2::def2 = std::make_pair(20, 4); - 修正主文件引入逻辑:删除主函数中对
R.cpp和S.cpp的引入,只保留对头文件的引用,编译时将S.cpp、R.cpp、main.cpp一起编译链接即可。 - 修复语法错误:把主函数中的
s.print()改为s->print()。
编译示例
使用gcc编译时执行以下命令即可生成可执行文件:
g++ main.cpp S.cpp R.cpp -std=c++17 -o test
内容的提问来源于stack exchange,提问作者John Lauren
相关产品推荐
相关产品推荐

