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
相关产品推荐
相关产品推荐

