我试图在另一个源文件中分离我的函数。但是我在添加函数时遇到多个定义的错误。
主要源文件
Main.cpp的
#include<iostream>
#include "myHeader.h"
using namespace std;
int main()
{
int result = add(1,2);
}
头文件“myHeader.h”
#include "calc.cpp"
int add(int, int);
其他源文件“calc.cpp”
int add(int a, int b)
{
return a+b;
}
答案 0 :(得分:7)
您需要的是:
“myHeader.h”
#ifndef MY_HEADER
#define MY_HEADER
int add(int, int);
#endif
calc.cpp
#include "myHeader.h"
int add(int a, int b)
{
return a+b;
}
的main.cpp
#include "myHeader.h"
int main()
{
int result = add(1,2);
return 0;
}
你不将.cpp包含在.h中。头文件用于告诉编译器是否存在具有指定原型的函数,但是liker将关注将函数调用与该函数的实现进行匹配。
此外,通常最好为您提供头文件和.cpp相同的名称,因此calc.h
和calc.cpp
而不是myHeader.h
。
答案 1 :(得分:2)
请勿在{{1}}中加入calc.cpp
。除了那一行之外,就标题而言,你的例子是正确的。 (myHeader.h
应该返回一个值)。
main()
和calc.cpp
是两个不同的“编译单元”,它们将分别编译为目标文件。然后,这两个目标文件由链接器组合成一个可执行文件。
答案 2 :(得分:1)
问题在于您将代码文件(cpp)包含在标头中。你应该做反过来。将标题“myHeader.h”包含在calc.cpp中。为了保持连贯,您应该将您的标题命名为与您的代码文件相同的名称,因此标题的calc.h和代码的calc.cpp。
答案 3 :(得分:0)
#include "calc.cpp"
不要这样做 - 它包含任何包含标题的翻译单元中的函数定义,因此您最终会得到多个定义。
如果没有它,如果您从两个源文件构建程序,您的代码应该没问题。 main.cpp
将包含声明,以便它知道该函数存在;来自其他源文件的定义将由链接器包含在程序中。
答案 4 :(得分:0)
这很简单。请勿将"calc.cpp"
文件包含在"MyHeader.h"
文件中。
另请参阅C / C ++ IncludeGuard here
这是C / C ++编程的基础。你需要多次使用它。
保护您的“myHeader.h”
#ifndef ADD_HEADER
#define ADD_HEADER
int add(int, int);
#endif // ADD_HEADER
答案 5 :(得分:0)
不包括calc.cpp。这导致了重新定义
你可以在calc.cpp中包含myHeader.h