我正在尝试将外部文件中的函数调用到源文件。但是,当我这样做时,我收到以下错误:
为什么我会收到以下错误?我一直试图全身心投入,但这一切都是徒劳的。 P.S我对语言和编程很新。过去的经验:Python
source.cpp
#include <iostream>
#include <string>
#include "func.cpp"
using namespace std;
double pow(double x, int y);
int main()
{
double x;
int y;
double answer;
cout << "Choose a number: " << endl;
cin >> x;
cout << "Raised to the power: " << endl;
cin >> y;
answer = pow(x, y);
cout << "Answer: " << answer << endl;
return answer;
}
func.cpp
double pow(double x, int y)
{
double result = 1;
if (x == 0 && y == 0)
{
result = -1;
}
else
{
if (y == 0)
{
result = 1;
}
else if (y < 0)
{
x = 1.0 / x;
y *= -1;
}
for (int i = 0; i < y; i++)
{
result *= x;
}
}
return result;
}
答案 0 :(得分:2)
这里发生了一些事情。最直接的标题之一就是声明std::pow
或using namespace std;
。尽管我想在pow
上责备这一切,但是好的&#39; C pow
函数足以破坏编译器。编译器找到两个具有相似足够参数的mypow
,并且不知道要使用哪个namespace my
{
double pow(double x, int y)
{
// guts of pow are unchanged
}
}
。而是将您的函数命名为double pow(double x, int y);
或将其放在您自己的命名空间中。
例如:func.cpp
namespace my
{
double pow(double x, int y);
}
和source.cpp
answer = my::pow(x, y);
成为
pow
并被称为
pow
解决了问题1.
问题2是您尚未见到的链接器问题。在你的项目中,func.cpp将被编译为func.obj。 func.cpp也包含在source.cpp中。包含的函数被有效地粘贴到包含文件中,因此,您现在有两个正在编译的func中的所有副本。可以在func.obj和source.obj中找到#pragma once
namespace my
{
double pow(double x, int y);
}
。
当链接器尝试将func.obj和source.obj组合到单个可执行文件中时,这就成了问题。链接器找到两个namespace my
{
double pow(double x, int y)
{
double result = 1;
if (x == 0 && y == 0)
{
result = -1;
}
else
{
if (y == 0)
{
result = 1;
}
else if (y < 0)
{
x = 1.0 / x;
y *= -1;
}
for (int i = 0; i < y; i++)
{
result *= x;
}
}
return result;
}
}
,与编译器类似,不知道使用哪个。
标准的经验法则是不包括cpp文件。让编译器编译它们,链接器链接它们。创建一个标题,公开cpp文件中需要在外部使用并让用户包含标题的函数。
这使您的程序看起来像
func.h
#include <iostream>
#include <string>
#include "func.h"
using namespace std;
int main()
{
double x;
int y;
double answer;
cout << "Choose a number: " << endl;
cin >> x;
cout << "Raised to the power: " << endl;
cin >> y;
answer = my::pow(x, y);
cout << "Answer: " << answer << endl;
return answer;
}
func.cpp
{{1}}
source.cpp
{{1}}
无关,但阅读良好:Why is "using namespace std" considered bad practice?
答案 1 :(得分:0)
以下是解决问题所需的全部内容:
第1步 -
通过将扩展名更改为&#39; .hpp&#39;将第二个c ++文件更改为c ++头文件。在另一个文件中。
第2步 -
从source.cpp中删除第6行
以上内容应解决您的问题。