在头文件中定义 C 函数是一种好习惯吗?

新手上路,请多包涵

我想知道将 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;
}

这是一个好习惯吗?提前致谢!

原文由 Nobody 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 557
2 个回答

如果您想在多个源文件(或者更确切地说, 翻译单元)中使用一个函数,那么您将函数 _声明_(即函数原型)放在头文件中,并将 定义 放在一个源文件中。

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


示例代码:

  • 头文件
    #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 选项所做的,告诉输出文件的名称)。

原文由 Some programmer dude 发布,翻译遵循 CC BY-SA 4.0 许可协议

不,如果你从两个文件中导入相同的头文件,你会重新定义函数。

但是,如果函数是内联的,则通常是这样。每个文件都需要它的定义来生成代码,所以人们通常把定义放在头文件中。

使用 static 也可以,因为静态函数不是从目标文件中导出的,这样在链接过程中就不会干扰其他同名函数。

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

原文由 Alexey Shmalko 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题