2012-07-22 104 views
3

我有以下3个文件(1间*的.cpp和2 * .HPP):如何从C++中的另一个头文件调用一个函数?

主程序文件:

// 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?

+2

你是否在头本身实现了函数?如果是,那很糟糕。在头文件中有函数声明并在'.cpp'文件中实现它们。在希望使用这些函数的地方添加标题,并记住构建** all **源文件。虽然这不是功能模板的情况,这不是这里的情况。 – Mahesh 2012-07-22 18:12:41

回答

4

将函数定义放置到.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; 
} 

同为第二FUNC。

然后,无论你想打电话给你的first_func,你只包括cpp模块在相应的first_func.hpp,并编写调用。因此,您的每个模块都由hpp及其所有声明组成,cpp由定义(即主体)组成。当你需要从这个模块引用某些东西时,你需要包括它的hpp并且使用名称(常量,变量,函数等等)。

,然后必须链接在一起的一切:

gcc main.cpp first_func.cpp second_func.cpp -o program 
+0

为什么downvotes? – steffen 2012-07-22 18:38:11

+0

不是最纯粹的解释吗? ;) – spacediver 2012-07-22 18:40:38

+0

将函数定义放在头文件中有时很有意义,特别是如果它们是应该内联的小函数。你的函数签名是无效的C++。你可能应该解释(或暗示)*翻译单元的概念*。其他答案要好得多,这可能会触发downvotes。 – pmr 2012-07-22 18:44:11

4

要在标题定义函数,则必须将其标记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; 
} 
+0

我怀疑这是'自己声明函数'而不是包含正确的头文件的好主意。 – spacediver 2012-07-22 18:19:29

+0

@spacediver我刚刚列出了两种选择,我也希望包括标题。 – 2012-07-22 18:20:14

6

对于大多数功能,实施应驻留在编译单元,那是要由自己来编译和编译一次的文件。

标题不是自己编译*,而是由多个编译单元包含。

这就是为什么你的函数定义应该驻留在编译单元(比如.cpp)中,而不是头文件。标题只能包含声明(即没有声明),这样其他编译单元就知道如何调用它们。


为了完整起见,通常需要在标头中定义(作为例外)的功能是:

  • inline功能
  • 模板函数**(类太)

脚注:

*头文件实际上可以预编译,但这是一种加速编译的解决方案,它不会改变它们的用途;不要因此而感到困惑。
**如果使用显式模板实例化,则可以将模板函数定义放在标题外部,但这种情况很少见;问题的关键在于每个想要实例化模板的编译单元(应用参数)都需要有完整的定义,这就是为什么模板函数定义也会进入标题的原因。

相关问题