c/c++头文件
有同事问.hpp是什么,因为.hpp头文件在c++项目中很常见,所以当时懵了一下觉得他问的不是头文件这个问题,然而…看来还是有必要对头文件做个总结。
头文件扩展名
c++项目中常见的头文件扩展名有.h
、.hh
、.hpp
、.hxx
、.h++
几种,这些扩展名都是约定俗称的,而c++ 标准并没有指定头文件类型和扩展名。
编译器根据#include
指令指定的文件名来查找和包含头文件内容,并不关心头文件的扩展名是什么。也就是说我们可以使用任何扩展名作为头文件的文件名,例如.head
、.txt
、.md
甚至.cpp
。约定俗称的扩展名是为了方便程序员之间的合作,所以尽量不要有骚操作。
头文件的作用
头文件的作用主要有两个
- 复用代码:
#include
指令会将头文件的代码复制到当前文件中,避免在不同的源文件中重复编写声明、定义代码。 - 提供接口:在开发库或模块时,头文件通常用于定义库的接口和公共函数。用户可以通过包含库的头文件来使用库模块提供的接口。此时头文件相当于说明书,说明库模块提供了哪些能力和接口。
头文件中的代码具有两个特点:简单、被多个源文件复用。内容一般包括 变量声明、函数声明、结构体声明、类声明、宏定义、常量定义、内联函数定义、模板函数定义等。
头文件的原理
c/c++代码从源码到可执行文件(或者二进制库文件)会经历预编译、编译、汇编、链接4个阶段。头文件在预编译阶段发生作用,在预编译阶段编译器会将头文件展开到源文件中,所谓展开就是将头文件的代码原封不动地复制到源文件中。
gcc编译器可以使用-E选项只执行预编译。例如
gcc MyMath.cpp -E
得到MyMath.cpp
预编译后的内容。
举个例子。考虑头文件MyMath.h
和两个源文件MyMath.cpp
、Main.cpp
typedef int Number;
Number Add(Number a, Number b);
Number Sub(Number a, Number b);
#include "MyMath.h"
Number Add(Number a, Number b)
{
a + b;
}
Number Sub(Number a, Number b)
{
return a - b;
}
#include "MyMath.h"
int main()
{
Number sum = Add(12, 3);
Number sub = Sub(12, 3);
}
源文件MayMath.cpp
和Main.cpp
都#include
了头文件MyMath.h
,经过预编译阶段展开头文件后两个源文件分别包含一份头文件中的代码,就像下面这样
// 以下是头文件 MyMath.h 展开后的代码
typedef int Number;
Number Add(Number a, Number b);
Number Sub(Number a, Number b);
// 以下是 MyMath.cpp 原来的代码
Number Add(Number a, Number b)
{
a + b;
}
Number Sub(Number a, Number b)
{
return a - b;
}
// 以下是头文件 MyMath.h 展开后的代码
typedef int Number;
Number Add(Number a, Number b);
Number Sub(Number a, Number b);
// 以下是 Main.cpp 原来的代码
int main()
{
Number sum = Add(12, 3);
Number sub = Sub(12, 3);
}
由于编译期间每个源文件都是独立编译的,所以每个源文件都需要保证在使用函数、变量、结构体之前已经声明或者定义了。如果不使用头文件,就要在每个源文件中重复编写相同声明或者定义函数、变量、结构体的代码,这些代码可以只在头文件中编写一次,然后在需要的源文件中#include
头文件。
原文地址:https://blog.csdn.net/sinat_36817189/article/details/136516706
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!