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

C++编译器多重定义错误修复:数组元素绝对值求和程序编译报错问题

问题原因

你把getAbsSum函数的完整实现写在了头文件getAbsSum.h中,而main.cpp和getAbsSum.cpp两个源文件都引入了这个头文件,导致两个编译单元生成的目标文件中都存在getAbsSum函数的定义,链接阶段就会触发多重定义报错。

修复方案

推荐使用「头文件放声明、源文件放实现」的C++项目标准写法:

第一步:修改getAbsSum.h

仅保留函数声明、必要的头文件引入,删除函数实现:

#include <iostream>
using std::cin,std::cout,std::endl;

// 仅保留函数声明
void getAbsSum(int arr[10]);

第二步:修改getAbsSum.cpp

把原来头文件里的函数实现移到这个文件中,同时修正原有错误的计算逻辑:

#include "getAbsSum.h"

#pragma clang diagnostic push
#pragma ide diagnostic ignored "cppcoreguidelines-narrowing-conversions"
void getAbsSum(int arr[10]){
    int sum = 0;
    // 注意:函数参数的int arr[10]会退化为指针,原有的*(&arr + 1) - arr无法得到正确数组长度,这里固定用10
    for (int i = 0; i < 10; ++i) {
        // 修正绝对值求和逻辑
        sum += arr[i] < 0 ? -arr[i] : arr[i];
    }
    cout << sum;
} 
#pragma clang diagnostic pop

可选快速修复方案

如果不想拆分声明和实现,也可以直接给头文件里的getAbsSum函数加上inline关键字,告诉编译器允许多个编译单元存在该函数的相同定义:

inline void getAbsSum(int arr[10]){
    // 函数实现
}

内容的提问来源于stack exchange,提问作者MAMO GRAG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:45:05