我想知道在头文件中存储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;
}
这是一个好习惯吗? 感谢
答案 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)
没有。预处理后,每个源文件都将包含头文件。然后,在链接阶段,您将得到一个多重定义错误,因为您将拥有相同函数的多个定义。
使用inline
或static
将消除链接错误。除非您希望函数为inline
,否则最好在头文件中声明函数,并在单个源文件中定义并链接它。 / p>
如果将函数声明为inline
,则源文件中的每个函数调用都将替换为inline
d函数内的代码。因此,没有定义额外的符号。
如果将函数声明为static
,则不会从转换单元导出函数符号。因此,没有重复的符号。