在头文件中定义C ++函数

时间:2014-08-12 21:25:46

标签: c++ function

我想知道在头文件中存储c ++常规函数,而不是方法(类中的方法)是否是一个好习惯。

示例:

#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED

int add(int a, int b)
{
   return a + b;
}

#endif

并像这样使用它:

#include <iostream>
#include "Functions.h"

int main(int argc, char* args[])
{
    std::cout << add(5, 8) << std::endl;
    return 1;
}

这是一个好习惯吗? 感谢

3 个答案:

答案 0 :(得分:21)

如果要在多个源文件中使用函数(或者更确切地说,translation units),则在头文件中放置函数声明(即函数原型),并且定义在一个源文件中。

构建时,首先将源文件编译为目标文件,然后将目标文件链接到最终的可执行文件中。


示例代码:

  • 标头文件

    #ifndef FUNCTIONS_H_INCLUDED
    #define FUNCTIONS_H_INCLUDED
    
    int add(int a, int b);  // Function prototype, its declaration
    
    #endif
    
  • 第一个源文件

    #include "functions.h"
    
    // Function definition
    int add(int a, int b)
    {
        return a + b;
    }
    
  • 第二个源文件

    #include <iostream>
    #include "functions.h"
    
    int main()
    {
        std::cout << "add(1, 2) = " << add(1, 2) << '\n';
    }
    

如何构建它取决于您的环境。如果您使用的是IDE(如Visual Studio,Eclipse,Xcode等),那么您可以将所有文件放入项目中的正确位置。

如果您是从命令行构建的,例如Linux或OSX,那么你喜欢

$ g++ -c file1.cpp
$ g++ -c file2.cpp
$ g++ file1.o file2.o -o my_program

标志-c告诉编译器生成一个目标文件,并将其命名为与源文件相同但后缀为.o的文件。最后一个命令将两个目标文件链接在一起形成最终的可执行文件,并将其命名为my_program-o选项的作用,告诉输出文件的名称)。

答案 1 :(得分:10)

没有。如果从两个文件导入相同的标题,则可以重新定义函数。

但是,通常函数是内联函数。每个文件都需要它来定义生成代码,因此人们通常将定义放在标题中。

使用static也是有效的,因为静态函数不会从目标文件中导出,因此在链接过程中不会干扰其他具有相同名称的函数。

也可以在标题中的class内定义成员函数,因为C ++标准将它们视为inline

答案 2 :(得分:1)

没有。预处理后,每个源文件都将包含头文件。然后,在链接阶段,您将得到一个多重定义错误,因为您将拥有相同函数的多个定义。

使用inlinestatic将消除链接错误。除非您希望函数为inline,否则最好在头文件中声明函数,并在单个源文件中定义并链接它。 / p>

如果将函数声明为inline,则源文件中的每个函数调用都将替换为inline d函数内的代码。因此,没有定义额外的符号。

如果将函数声明为static,则不会从转换单元导出函数符号。因此,没有重复的符号。

相关问题