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.cppMain.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.cppMain.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头文件。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值