gpt4 book ai didi

c++ - 从外部文件 C++ 调用函数

转载 作者:行者123 更新时间:2023-11-30 03:23:05 27 4
gpt4 key购买 nike

我正在尝试从外部文件调用函数到源文件。但是,当我这样做时,出现以下错误:

Build Error Visual Studio C++

为什么会出现以下错误?我整天都在想办法解决这个问题,但一切都是徒劳的。 P.S 我对一般的语言和编程很陌生。以往经验:Python

源代码.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;
}

函数.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;
}

最佳答案

这里发生了几件事。最直接的是您包含的 header 之一是声明 powstd::pow。尽管我很想将这一切归咎于 using namespace std;,但优秀的 C pow 函数足以让编译器脱轨。编译器找到两个具有足够相似参数的 pow,但不知道要使用哪一个。而是将您的函数命名为 mypow 或将其放在您自己的命名空间中。

例如:func.cpp

namespace my
{
double pow(double x, int y)
{
// guts of pow are unchanged
}
}

在 source.cpp 中

double pow(double x, int y);

成为

namespace my
{
double pow(double x, int y);
}

被称为

answer = my::pow(x, y);

这解决了问题 1。

问题 2 是您还没有看到的链接器问题。在您的项目中,func.cpp 将被编译为 func.obj。 func.cpp 也包含在 source.cpp 中。一个包含的函数被有效地粘贴到包含文件中,因此,您现在拥有正在编译的 func 中所有内容的两个拷贝。 pow 可以在 func.obj 和 source.obj 中找到。

当链接器试图将 func.obj 和 source.obj 组装成一个可执行文件时,这就会成为一个问题。链接器找到两个 pow,并且与编译器类似,不知道要使用哪个。

标准的经验法则是不包含 cpp 文件。让编译器编译它们,让链接器链接它们。创建一个 header ,将 cpp 文件中需要在外部使用的函数公开,并让用户包含 header 。

这让你的程序看起来像

函数.h

#pragma once
namespace my
{
double pow(double x, int y);
}

函数.cpp

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

#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;
}

不相关,但值得一读:Why is "using namespace std" considered bad practice?

关于c++ - 从外部文件 C++ 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50652321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com