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

时间:2018-06-02 00:04:21

标签: c++ function visual-c++

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

Build Error Visual Studio C++

为什么我会收到以下错误?我一直试图全身心投入,但这一切都是徒劳的。 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;
}

2 个答案:

答案 0 :(得分:2)

这里发生了一些事情。最直接的标题之一就是声明std::powusing 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行

以上内容应解决您的问题。