修复 C++ 编译器错误 - 多重定义

Fix for C++ Compiler Error - multiple definition

我正在尝试编写一个程序,为您提供数组元素绝对值之和。

这是头文件:

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

#pragma clang diagnostic push
#pragma ide diagnostic ignored "cppcoreguidelines-narrowing-conversions"
void getAbsSum(int arr[10]){
int abs = 0,sum = 0;
int len = *(&arr + 1) - arr;
for (int i = 0; i < len; ++i) {
    if (arr[i] < 0 ) {
        abs++;
        if (abs * *arr == *arr)
            arr[i] = abs;
        else
            continue;
    }
    else
        continue;
    sum+= *arr;
}
cout << sum;
} 
 #pragma clang diagnostic pop

这是getAbsSum.cpp

#include "getAbsSum.h"
void getAbsSum(int arr[10]);

这是 main.cpp

#include <iostream>
#include "getAbsSum.h"
using std::cin,std::cout,std::endl;
int main() {
int arr[10];
for (int & i : arr)
  cin >> i;
getAbsSum(arr);
return 0;
}

这是错误:

    /home/mamog/CLionProjects/Absolute_sum/getAbsSum.h:6: multiple definition of `getAbsSum(int*)'; CMakeFiles/Absolute_sum.dir/main.cpp.o:/home/mamog/CLionProjects/Absolute_sum/getAbsSum.h:6: first defined here
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/Absolute_sum.dir/build.make:108: Absolute_sum] Error 1
make[2]: *** [CMakeFiles/Makefile2:83: CMakeFiles/Absolute_sum.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:90: CMakeFiles/Absolute_sum.dir/rule] Error 2
make: *** [Makefile:124: Absolute_sum] Error 2

Headers 被 文本 替换到每个编译单元中 #include;结果,您在 getAbsSum.cppmain.cpp 中都有 定义 of getAbsSum。这违反了 one-definition 规则。

使用 header 的正确方法是在 header 中包含 声明 定义 在cpp文件中;你把这个弄反了。

或者,对于small函数没有太多的依赖,你可以选择去掉getAbsSum.cpp,在[=中标记定义33=] 为 inline,然后包括您的 header 在内的任何人都将获得该函数的定义。

.h.cpp 文件被反转。代码应在 .cpp 中,声明应在 .h header.

getAbsSum.h:

void getAbsSum(int arr[10]);

getAbsSum.cpp

#include "getAbsSum.h"
#include <iostream>

using std::cin,std::cout,std::endl;

#pragma clang diagnostic push
#pragma ide diagnostic ignored "cppcoreguidelines-narrowing-conversions"
void getAbsSum(int arr[10]){
int abs = 0,sum = 0;
int len = *(&arr + 1) - arr;
for (int i = 0; i < len; ++i) {
    if (arr[i] < 0 ) {
        abs++;
        if (abs * *arr == *arr)
            arr[i] = abs;
        else
            continue;
    }
    else
        continue;
    sum+= *arr;
}
cout << sum;
} 
 #pragma clang diagnostic pop