C++头文件包含顺序

2023-05-16

《Google C++ 编程风格指南》对于头文件的包含顺序是这样的:

Names and Order of Includes

link Use standard order for readability and to avoid hidden dependencies:C library, C++ library, other libraries' .h, your project's .h.

All of a project's header files should belisted as descendants of the project's source directory without use of UNIXdirectory shortcuts . (the current directory) or .. (the parent directory). Forexample, google-awesome-project/src/base/logging.h should be included as

#include "base/logging.h"

In dir/foo.cc or dir/foo_test.cc, whosemain purpose is to implement or test the stuff in dir2/foo2.h, order yourincludes as follows:

dir2/foo2.h (preferred location — seedetails below).

C system files.

C++ system files.

Other libraries' .h files.

Your project's .h files.

The preferred ordering reduces hiddendependencies. We want every header file to be compilable on its own. Theeasiest way to achieve this is to make sure that every one of them is the first.h file #included in some .cc.

dir/foo.cc and dir2/foo2.h are often in thesame directory (e.g. base/basictypes_test.cc and base/basictypes.h), but can bein different directories too.

Within each section it is nice to order theincludes alphabetically.

 

For example, the includes ingoogle-awesome-project/src/foo/internal/fooserver.cc might look like this:

[cpp] view plaincopy

  1. <span style="font-size:16px;">  
  2. #include "foo/public/fooserver.h"  // Preferred location.  
  3.   
  4. #include <sys/types.h>  
  5.   
  6. #include <unistd.h>  
  7.   
  8.    
  9.   
  10. #include <hash_map>  
  11.   
  12. #include <vector>  
  13.   
  14.    
  15.   
  16. #include "base/basictypes.h"  
  17.   
  18. #include"base/commandlineflags.h"  
  19.   
  20. #include "foo/public/bar.h"  
  21.   
  22.  </span>  

头文件包含顺序可归纳如下:

1. 为了加强可读性和避免隐含依赖,应使用下面的顺序:C标准库、C++标准库、其它库的头文件、你自己工程的头文件。不过这里最先包含的是首选的头文件,即例如a.cpp文件中应该优先包含a.h。首选的头文件是为了减少隐藏依赖,同时确保头文件和实现文件是匹配的。具体的例子是:假如你有一个cc文件(linux平台的cpp文件后缀为cc)是google-awesome-project/src/foo/internal/fooserver.cc,那么它所包含的头文件的顺序如下:

[cpp] view plaincopy

  1. <span style="font-size:16px;">#include "foo/public/fooserver.h"  // Preferred location.  
  2.   
  3. #include <sys/types.h>  
  4. #include <unistd.h>  
  5.   
  6. #include <hash_map>  
  7. #include <vector>  
  8.   
  9. #include "base/basictypes.h"  
  10. #include "base/commandlineflags.h"  
  11. #include "foo/public/bar.h"  
  12.   
  13. </span>  

2. 在包含头文件时应该加上头文件所在工程的文件夹名,即假如你有这样一个工程base,里面有一个logging.h,那么外部包含这个头文件应该这样写:

#include "base/logging.h",而不是#include "logging.h"

 

我们看到的是这里《Google C++ 编程风格指南》倡导的原则背后隐藏的目的是:

1. 为了减少隐藏依赖,同时头文件和其实现文件匹配,应该先包含其首选项(即其对应的头文件)。

2. 除了首选项外,遵循的是从一般到特殊的原则。不过我觉得《Google C++ 编程风格指南》的顺序:C标准库、C++标准库、其它库的头文件、你自己工程的头文件中漏了最前面的一项:操作系统级别的头文件,比如上面的例子sys/types.h估计不能归入C标准库,而是Linux操作系统提供的SDK吧。因此我觉得更准确的说法应该是:OS SDK .h , C标准库、C++标准库、其它库的头文件、你自己工程的头文件。

3.之所以要将头文件所在的工程目录列出,作用应该是命名空间是一样的,就是为了区分不小心造成的文件重名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++头文件包含顺序 的相关文章

  • C#中struct和class的区别

    本文详细分析了C 中struct和class的区别 xff0c 对于C 初学者来说是有必要加以了解并掌握的 简单来说 xff0c struct是值类型 xff0c 创建一个struct类型的实例被分配在栈上 class是引用类型 xff0c
  • 沁恒MCU串口使用指南

    转载注明出处 沁恒MCU串口使用指南 xff1a 适用于WCH的32位MCU和CH559 558单片机 只描述TTL电平的TX 43 RX形式的常规串口 xff0c 流控 xff0c RS232 RS485不在文章涉及范围之内 大部分8位机
  • ubuntu安装网络调试助手

    下载mNetAssist安装包 链接 https pan baidu com s 1eHalZSnsVKXRERmIOCfj0w 提取码 bhxs新建终端并切换到安装包所在目录sudo dpkg i mNetAssist release a
  • .s19 文件转换为 .hex 和 .bin文件的方法

    使用STVD开发时 xff0c 编译后产生的是 s19 文件 xff0c 与Keil 和 IAR常见的 hex bin文件不同 xff0c 那么如何将 s19文件转换为常见的文件格式呢 xff1f 一 获取工具 burner 下载链接 xf
  • VS Code中C/C++ 无法跳转到定义的解决办法

    VS code的跳转功能一直很迷 xff0c 时好时坏 xff0c 有些新的工程环境干脆用不了 经过一遍遍的baidu加上自己的摸索 xff0c 总结出一套经验 xff0c 应该可以解决大部分的情况了 一 首先 xff0c 当然是安装插件了
  • 使用void*强转函数指针(编辑中)

    别把函数名当成函数 xff0c just a 变量 typedef void AirCb void 空回调函数 typedef int aimFunction int para1 char para2 int para3 要传递的目标函数
  • KoroFileHeader 配置

    一 安装插件 二 Github 地址 https github com OBKoro1 koro1FileHeader 三 快速上手 https github com OBKoro1 koro1FileHeader wiki E5 AE 8
  • 网络接入与身份认证简介

    目录 1 认证简介 2 常见认证机制 基于口令的身份认证机制 挑战 响应认证机制 EAP认证机制 3 公钥认证机制 4 使用认证机制的认证协议 RADIUS认证协议 TACACS 43 认证协议 Kerberos认证协议 LDAP协议 5
  • VS Code常见问题

    1 更改自动补全 xff08 联想 xff09 快捷键的方法 文件 gt 首选项 gt 键盘快捷方式 搜索trigger 找到该选项 xff0c 更改快捷键 2 当鼠标悬停在枚举值上 xff0c 不能显示当前序号 a 打开setting j
  • 用Keil编译C51和ARM时,分别生成.Bin文件的方法

    一 C51 1 使用srec cat exe a Keil工程需生成 hex文件 b 将srec cat exe放在工程路径中任意文件夹下 c 新建一个文本文档 xff0c 之后填写如下内容 xff0c 保存后更名为 1 bat xff08
  • Keil新建Stm32标准工程中 Preprocessor Symbols的作用

    xff08 转自正点原子的回复 xff09 标准的工程新建办法 是要添加 34 USE STDPERIPH DRIVER STM32F10X HD的 USE STDPERIPH DRIVER 是告诉编译器 我们需要使用标准库了 实际上是 c
  • 单片机中利用Union联合体打印输出浮点数(小数)

    方法一 xff1a 指针 UART串口有一个缺点 xff0c 就是发送和接受是一个字节一个字节的接收 xff0c 如果发送的浮点数那可怎么办啊 xff1f 有人会说 xff0c 那就一个字节一个字节发送啊 那么 xff0c 我先定义一个do
  • 用 IAR 开发 STM8 时,简单软件延时不起作用的原因

    近期有幸接手了前任工程师遗留的项目 xff0c MCU 选择的是 STM8L151XX xff0c 开发工具使用的是 IAR 打开祖传代码后 xff0c 通读了一遍 xff0c 就用ST Link烧录进去跑程序 xff0c 结果发现和预想的
  • 基于SX1276芯片的 LORA 技术开发详解

    一 简介 LORA xff0c 是 Long Range 的简称 LORA 技术 xff0c 源自于美国的升特公司 xff08 Semtech xff09 xff0c 是一种用于中 长距离传输的技术 xff0c 相关信息主要从升特公司官网获
  • Linux下用C语言将一个字符串格式(char*)的MAC地址转换为十六进制数组

    include lt stdio h gt include lt stdlib h gt unsigned char a2x const char c switch c case 39 0 39 39 9 39 return unsigne
  • 超声波换能器的主要参数解读,全!

    1 导纳是阻抗的倒数 xff0c 也就是一个代表困难程度的量 xff0c G为电导 xff0c B为电纳 导纳Y是一个复数 xff0c Y 61 G 43 jB xff1b 实部为电导 xff0c 虚部为电纳 G越大 xff0c 说明电荷越
  • 温度对超声波换能器的影响

    我们都知道超声波换能器的主要参数有 xff1a 谐振频率 反谐振频率 谐振阻抗 反谐振阻抗 输出幅值 静态电容等 在平时使用换能器的时候 xff0c 除了超声波换能器有自身损耗的影响外 xff0c 很可能使用场合出现在室内或室外 xff0c
  • RC522模块学习

    目录 1 原理简介 2 SPI通信 3 获取卡号实验 3 驱动函数 参考 xff1a https www cnblogs com ivantang p 3904025 html https xiaolong blog csdn net ar
  • 从零学习GCC,Makefile,CMakeList编译

    近期想系统地学习一下C 43 43 软件开发 xff0c 因此记录一下自己的学习笔记 xff0c 方便复习 大多数内容都是整理搬运别的博主文章内容 xff0c 加上自己的理解归纳 如果大家想了解更深的内容或者有不明白的地方 xff0c 可以
  • AS608指纹模块

    目录 1 简介 2 上位机测试 3 stm32程序 1 简介 AS608指纹识别模块是一款高性能的光学指纹识别模块 模块配备了串口 USB通讯接口 xff0c 用户无需研究复杂的图像处理及指纹识别算法 xff0c 只需通过简单的串口 USB

随机推荐