[英]Function call from external file 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;
}
這里發生了幾件事情。 最直接的是您包含的標頭之一是聲明pow
或std::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.