You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++跨文件使用另一文件的const pair出现重定义错误如何解决

错误原因
  1. 头文件未添加包含保护:S.hpp中没有设置头文件包含防护,当多个文件引入S.hpp时,内部定义的def1、def2常量会被多次展开,触发重定义报错。
  2. 主文件错误引入实现文件:主函数中直接#include "R.cpp"和#include "S.cpp",会把两个实现文件的全部内容合并到主函数的编译单元,进一步重复引入头文件定义,放大重定义问题。
  3. 存在语法错误:主函数中s是shared_ptr类型,不能直接用.调用成员方法,需要用->。
修复方案
  • 给所有头文件添加包含保护:可以在头文件首行添加#pragma once(编译器通用),或者使用传统的宏防护格式:
    #ifndef S_HPP
    #define S_HPP
    // 头文件原有内容
    #endif
    
  • 调整常量定义方式:
    如果使用C++17及以上版本,直接在头文件的const常量前加inline关键字,允许多个编译单元存在同一定义:
    inline const conf def1 = std::make_pair(10, 2);
    inline const conf def2 = std::make_pair(20, 4);
    
    如果使用C++17以下版本,把头文件中的常量定义改为extern声明:
    // 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:36:04