我有以下3个文件(1 * .cpp和2 * .hpp):
主程序文件:
// test.cpp
#include<iostream>
#include"first_func.hpp"
#include"sec_func.hpp"
int main()
{
double x;
x = 2.3;
std::cout << sec_func(x) << std::endl;
}
- first_func.hpp标题:
// first_func.hpp
...
double first_func(double x, y, x)
{
return x + y + x;
}
- sec_func.hpp标题:
// sec_func.hpp
...
double sec_func(double x)
{
double a, b, c;
a = 3.4;
b = 3.3;
c = 2.5;
return first_func(a,b,c) + x;
}
如何在sec_func.hpp文件中正确调用first_func?
答案 0 :(得分:7)
对于大多数函数,实现应驻留在编译单元中,该文件将由自己编译并编译一次。
标题不能由它们自己编译*,而是由多个编译单元包含。
这就是为什么你的函数定义应该存在于编译单元(如.cpp)中,而不是在头文件中。标题应该只包含声明(即没有正文),只需要其他编译单元知道如何调用它们。
为了完整性,通常需要在头文件中定义的函数(作为例外)是:
inline
函数脚注:
*
标题实际上可以预先编译,但这是加速编译的解决方案,它不会改变它们的目的;不要为此感到困惑。
**
如果使用显式模板实例化,可以将模板函数定义放在标题之外,但这是一种罕见的情况;关键是每个想要实例化模板的编译单元(对它应用参数)都需要有完整的定义,这就是模板函数定义也进入标题的原因。
答案 1 :(得分:5)
将函数定义放到.hpp
文件中是一种不好的做法。你应该只放置函数原型。像这样:
first_func.hpp:
double first_func(double x, double y, double x);
first_func.cpp:
double first_func(double x, double y, double x)
{
return x + y + x;
}
第二个功能相同。
然后,无论您想要呼叫first_func
,只需在first_func.hpp
模块中添加相应的cpp
,然后编写呼叫即可。
因此,每个模块都包含hpp
所有声明,cpp
包含定义(即主体)。当您需要引用此模块中的某些内容时,请包含其hpp
并使用名称(常量,变量,函数等)。
然后你必须把所有东西连在一起:
gcc main.cpp first_func.cpp second_func.cpp -o program
答案 2 :(得分:3)
要在标题中定义函数,必须将其标记为inline
以防止多个定义。
如果你想这样做而不是将实现分离到一个单独的文件,你需要在调用函数之前提供一个原型(通过包含头文件(首选)或自己声明函数)。
// sec_func.hpp
#include "first_func.hpp"
//or
double first_func(double x, y, x); //declaration
double sec_func(double x)
{
double a, b, c;
a = 3.4;
b = 3.3;
c = 2.5;
return first_func(a,b,c) + x;
}