C++ 如何在其他源文件中定义函数:C++;代码块

C++ 如何在其他源文件中定义函数:C++;代码块,c++,header-files,C++,Header Files,我试图在另一个源文件中分离我的函数。但我在add函数上得到了多个定义的错误 主源文件 Main.cpp #include<iostream> #include "myHeader.h" using namespace std; int main() { int result = add(1,2); } 其他源文件“calc.cpp” 不包括myHeader.h中的calc.cpp。除了那一行之外,您的示例就标题而言是正确的。(main()应返回一个值) calc.cpp和main

我试图在另一个源文件中分离我的函数。但我在add函数上得到了多个定义的错误

主源文件

Main.cpp

#include<iostream>
#include "myHeader.h"
using namespace std;

int main()
{
int result = add(1,2);
}
其他源文件“calc.cpp”


不包括
myHeader.h
中的
calc.cpp
。除了那一行之外,您的示例就标题而言是正确的。(
main()
应返回一个值)

calc.cpp
main.cpp
是两个不同的“编译单元”,将分别编译成目标文件。然后,链接器将这两个对象文件合并为一个可执行文件

不要这样做-它将函数定义包含在包含标题的任何翻译单元中,因此最终会得到多个定义


如果没有这一点,那么如果您从两个源文件构建程序,那么您的代码应该很好
main.cpp
将包含一个声明,以便它知道函数存在;另一个源文件的定义将由链接器包含在程序中。

您的问题是在头文件中包含代码文件(cpp)。你应该做相反的事情。将标题“myHeader.h”包含到calc.cpp中。为了保持连贯性,您应该将头命名为与代码文件相同的名称,因此头的名称为calc.h,代码的名称为calc.cpp。

您需要的是:

“myHeader.h”

计算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中。头文件用于告诉编译器是否存在具有指定原型的函数,但类似的文件将负责将对函数的调用与该函数的实现相匹配


另外,给头文件和.cpp起相同的名字通常是个好主意,因此
calc.h
calc.cpp
而不是
myHeader.h
这非常简单。不要将您的
“calc.cpp”
文件包含在
“MyHeader.h”
文件中

再看看C/C++IncludeGuard

这是C/C++编程的基础。您将需要多次使用它

保护您的“myHeader.h”


不包括calc.cpp。这导致了重新定义


您可以将myHeader.h包含在calc.cpp中

对不起,systax错误。如果我从头文件中删除include语句,我的主函数是如何找到add函数的?是的,这是有效的,但如何?我的主函数只有头文件。它是如何找到add函数的定义的?@CodErr它在
calc.h
中找到函数的签名(声明),这是您从
main.cpp
中包含的。拥有签名就足以让编译器生成目标文件。函数的实际主体进入
calc.cpp
的对象文件。链接器的工作是将所有代码组合在一起,因此实际上是链接器“查找”函数的实际编译代码。好的,假设我将calc.cpp保存在项目文件夹之外的某个位置(我的comp HD中的任何位置)。那么链接器也能找到吗?我只是想了解链接器在哪里搜索具有函数定义的源文件。@CodErr我将在这里向您介绍编译器和链接器的详细功能;了解这一点可以回答您的问题:
#include "calc.cpp"
#ifndef MY_HEADER
#define MY_HEADER
 int add(int, int);
#endif 
#include "myHeader.h"

int add(int a, int b)
{
 return a+b;
}
#include "myHeader.h"

int main()
{
  int result = add(1,2);
  return 0;
}
#ifndef ADD_HEADER
#define ADD_HEADER
 int add(int, int);
#endif // ADD_HEADER