簡體   English   中英

從外部文件C ++進行函數調用

[英]Function call from external file C++

我正在嘗試從外部文件到源文件調用函數。 但是,當我這樣做時,出現以下錯誤:

生成錯誤Visual Studio C ++

為什么會出現以下錯誤? 我一直試圖整天解決這個問題,但是一切都徒勞無功。 PS我對語言和編程總體而言還是很新的。 過去的經驗: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;
}

這里發生了幾件事情。 最直接的是您包含的標頭之一是聲明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中所有內容的兩個副本。 可以在func.obj和source.obj中找到pow

當鏈接器嘗試將func.obj和source.obj組裝為單個可執行文件時,這將成為問題。 鏈接程序找到兩個pow並且類似於編譯器,不知道使用哪個。

標准的經驗法則是不包括cpp文件。 讓編譯器編譯它們,然后鏈接程序鏈接它們。 創建一個標頭,以暴露cpp文件中需要在外部使用的功能,並讓用戶包括該標頭。

這使您的程序看起來像

func.h

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

func.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;
    }
}

source.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;
}

無關但很好的閱讀: 為什么“使用命名空間標准”被認為是不好的做法?

這是解決此問題所需要做的一切:

第1步-

通過將擴展名更改為'.hpp'並在另一個文件中,將第二個c ++文件更改為c ++頭文件。

第2步-

從source.cpp刪除第6行

以上應該可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM