如何从C ++中的另一个头文件调用函数?

时间:2012-07-22 18:09:14

标签: c++ function

我有以下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?

3 个答案:

答案 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;
}