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

Nob*_*ody 16 c++ function

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

例:

#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED

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

#endif
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

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

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

这是好事吗?谢谢

Som*_*ude 29

如果要在多个源文件(或更确切地说,翻译单元)中使用函数,则在头文件中放置函数声明(即函数原型),并在一个源文件中放置定义.

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


示例代码:

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

如果您在Linux或OSX中使用命令行构建,那么您确实喜欢

$ g++ -c file1.cpp
$ g++ -c file2.cpp
$ g++ file1.o file2.o -o my_program
Run Code Online (Sandbox Code Playgroud)

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

  • @RoyAssis 在这个简单的情况下可能不需要它。但想一想什么时候函数实现需要在头文件中定义或声明一些结构体、宏或其他东西?您愿意包含所有内容都已写入的头文件,还是自己将其复制粘贴到源文件中?如果您选择复制粘贴,请考虑如果您需要修改头文件中的某些内容,但忘记在源文件中进行相同的编辑,会发生什么情况? (2认同)

Ale*_*lko 11

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

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

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

也可以class在C++标准中将其定义为in头内的成员函数inline.

  • 关于类成员函数的细节非常重要。+1 (2认同)

Nik*_*pol 6

否。在预处理之后,每个源文件都将包含头文件。然后,在链接阶段,您将遇到多个定义错误,因为您将拥有同一功能的多个定义。

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

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

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

  • 这是对正在发生的事情的恰当解释。 (2认同)