我想知道在头文件中存储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
如果要在多个源文件(或更确切地说,翻译单元)中使用函数,则在头文件中放置函数声明(即函数原型),并在一个源文件中放置定义.
在构建时,首先将源文件编译为目标文件,然后将目标文件链接到最终的可执行文件中.
示例代码:
头文件
#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED
int add(int a, int b); // Function prototype, its declaration
#endif
Run Code Online (Sandbox Code Playgroud)第一个源文件
#include "functions.h"
// Function definition
int add(int a, int b)
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)第二个源文件
#include <iostream>
#include "functions.h"
int main()
{
std::cout << "add(1, 2) = " << add(1, 2) << '\n';
}
Run Code Online (Sandbox Code Playgroud)如何构建它在很大程度上取决于您的环境.如果您使用的是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选项的作用,告诉输出文件的名称).
Ale*_*lko 11
不可以.如果从两个文件导入相同的标题,则可以重新定义函数.
但是,通常函数是内联的.每个文件都需要它的定义来生成代码,所以人们通常将定义放在标题中.
使用static也是有效的,因为静态函数不会从目标文件中导出,因此在链接期间不会干扰其他具有相同名称的函数.
也可以class在C++标准中将其定义为in头内的成员函数inline.
否。在预处理之后,每个源文件都将包含头文件。然后,在链接阶段,您将遇到多个定义错误,因为您将拥有同一功能的多个定义。
使用inline或static将消除链接错误。除非您希望该函数为inline,否则最好在标头中声明该函数并将其定义在单个源文件中并进行链接。
如果将函数声明为inline,则源文件中每个函数调用都将替换为inlined函数内的代码。因此,没有定义任何额外的符号。
如果将函数声明为static,则不会从翻译单元中导出功能符号。因此,没有重复的符号。
| 归档时间: |
|
| 查看次数: |
53279 次 |
| 最近记录: |