修复 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.cpp
和 main.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
我正在尝试编写一个程序,为您提供数组元素绝对值之和。
这是头文件:
#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.cpp
和 main.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