编程规范|关于头文件的几条规范

嵌入式大杂烩 2021-12-22 21:30

一般来说,每一个.c或者.cpp文件对应一个头文件(.h文件),当然,也有例外,例如一些测试单元或者main文件,头文件的一些规范可以令代码可读性、程序的性能等大为改观,所以还是要注意头文件的规范问题。

一、#define保护

所有头文件为了防止文件被多重包含(multiple inclusion),一般就需要#define保护。#define保护的格式如下:

___H_

例如:

#ifndef FOO_BAR_BARZ_H_
#define FOO_BAR_BARZ_H_

...

#endif //FOO_BAR_BARZ_H_

这个是比较老的一个做法了,所以很多编译器基本都是可以兼容的,但是还有另一个语句也是可以起到相同作用,但是一些太老的编译器据说用不了的(但是我好像没遇到过),VS下好像默认新建一个类的头文件就会用这个新的:

#program once

这一种相对于第一种的好处是,不通过#define一个变量来起到防止重复包含,所以,不存在重复变量的问题,#define后面的变量在同一个工程里是不能重复的,重复的话是只认一个的,就可能导致另一个文件编译的时候被排除。

二、头文件依赖

在头文件中减少包含其他头文件,改用前置声明(forward declarations),理由是:头文件被包含的同时会引入一项新的依赖(dependency),只要头文件被修改,代码就要重新编译,如果你的头文件包含了其它头文件,这些头文件的任何改动都将导致那些包含了你的头文件的代码重新编译。

使用前置声明就是在头文件中添加:

class Foo;

然后在对应的源文件中包含对应的头文件

#include 

可以这么做的几种情况:

1)、将数据声明为指针(Foo*)或者引用(Foo&);

2)、参数、返回值为Foo的函数只声明不定义;

3)、静态数据成员可以被声明为Foo,因为静态数据成员的定义在类定义之外;

但是,如果你的类是Foo的子类或者包含类型为Foo的非静态成员数据,则必须包含头文件。

补充说明,什么是声明,什么是定义,一般在头文件中经常看到一个函数,有返回值有输入参数,但是没有主体,或者一个变量声明为指针,但是没有new等操作,像这样的就是声明:

Foo *pFoo;
void setInputNumber(int num);

然后是定义,定义的话就是有函数主体,或者说就有变量的内存操作,包括非指针变量的声明也已经包含了定义,像这样的:

int nInputNumber;
int nCount = 0;
pFoo= new Foo();

void setInputNumber(int num)
{
    nInputNumber = num;
}

三、内联函数

当函数小于10行的时候可以定义为内联函数(inline function)。

定义:当函数被声明为内联函数后,编译器会将其内联展开,无需像通常的函数调用机制一样来调用内联函数。

优点:可以令目标代码更高效。适合存取函数或一些较短的关键代码。

缺点:滥用内联适得其反,内敛较大代码(如果编译器允许),将增加代码量;

不可用或者尽量不要用内联函数的情况:

1)、超过10行代码;

2)、析构函数;

3)、递归函数(可能大多数编译器不支持);

4)、包含循环或者switch语句的函数;

四、头文件包含实现代码

一般来说,头文件是只包含声明,而不要包含实现代码的,但是用到内联函数或者函数模板的话就需要将代码实现写在一起,为了可读性,是可以新建一个后缀为-inl.h的头文件,专门用于存放内联函数和模板函数,这样可以增强代码可读性。

需要注意,这样的头文件也要加#define保护的。

五、函数参数顺序(Function Parameter Ordering)

顺序:输入参数在前,输入输出参数居中,输出参数在后。

或者:输入参数在前,输入输出参数居中,输出参数在后,控制参数垫后。

输入参数一般为传值或者常数引用(const references),输出或者输入输出参数一般为传非常数指针(non-const pointers),有些参数是输入参数,但是属于控制变量意义的参数,那我是觉得应该放最后面的。

六、包含头文件顺序

如果我有一个命名为Foo.h的头文件以及一个对应的Foo.cpp的源文件,那么,头文件中的包含顺序应该是:

C库 > C++库 > 其他库的.h文件 > 项目内的.h文件;

而源文件中的包含顺序应该是:

#include "Foo.h" > C库 > C++库 > 其他库的.h文件 > 项目内的.h文件

还有一点强迫症的可以将同目录下的头文件按首字母顺序来排列。

补充说明,#include ""和#include <>的区别:

1)、#include <>引用的是编译器的类库路径里面的头文件;一般编译器会在编译器设置的include目录和系统中的INCLUDE环境变量中找头文件;一般用于标准文件;

2)、#include ""引用程序目录的相对位置的头文件;一般是先从当前文件所在的文件夹内找,找不到再去编译器设置的include目录或者系统的INCLUDE环境变量中找;一般用于自定义的文件。

结语

编程规范一方面是给机器看,提高代码的效率,另一方面也非常重要的用于给人看,提高人的效率。上述规范不一定就完全正确或者必须这么做,只是给个建议,看别人代码是超级累的一件事,简直想大呼这TM写的啥啊,何况更可怕的是看完发现这TM是我自己写的代码,想死的心都有了,利人终利己,就算出错了也好意思找别人帮忙看啊。

原文:https://www.cnblogs.com/Bearoom/p/11721800.html


版权归原作者所有,如有侵权,请联系删除。

嵌入式大杂烩 专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!
评论
  • 振动样品磁强计是一种用于测量材料磁性的精密仪器,广泛应用于科研、工业检测等领域。然而,其测量准确度会受到多种因素的影响,下面我们将逐一分析这些因素。一、温度因素温度是影响振动样品磁强计测量准确度的重要因素之一。随着温度的变化,材料的磁性也会发生变化,从而影响测量结果的准确性。因此,在进行磁性测量时,应确保恒温环境,以减少温度波动对测量结果的影响。二、样品制备样品的制备过程同样会影响振动样品磁强计的测量准确度。样品的形状、尺寸和表面处理等因素都会对测量结果产生影响。为了确保测量准确度,应严格按照规
    锦正茂科技 2025-02-28 14:05 134浏览
  • 在2024年的科技征程中,具身智能的发展已成为全球关注的焦点。从实验室到现实应用,这一领域正以前所未有的速度推进,改写着人类与机器的互动边界。这一年,我们见证了具身智能技术的突破与变革,它不仅落地各行各业,带来新的机遇,更在深刻影响着我们的生活方式和思维方式。随着相关技术的飞速发展,具身智能不再仅仅是一个技术概念,更像是一把神奇的钥匙。身后的众多行业,无论愿意与否,都像是被卷入一场伟大变革浪潮中的船只,注定要被这股汹涌的力量重塑航向。01为什么是具身智能?为什么在中国?最近,中国具身智能行业的进
    艾迈斯欧司朗 2025-02-28 15:45 221浏览
  •         近日,广电计量在聚焦离子束(FIB)领域编写的专业著作《聚焦离子束:失效分析》正式出版,填补了国内聚焦离子束领域实践性专业书籍的空白,为该领域的技术发展与知识传播提供了重要助力。         随着芯片技术不断发展,芯片的集成度越来越高,结构也日益复杂。这使得传统的失效分析方法面临巨大挑战。FIB技术的出现,为芯片失效分析带来了新的解决方案。它能够在纳米尺度上对芯片进行精确加工和分析。当芯
    广电计量 2025-02-28 09:15 116浏览
  • 美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?‌美国加州CEC能效认证与美国DOE能效认证在多个方面存在显著差异‌。认证范围和适用地区‌CEC能效认证‌:仅适用于在加利福尼亚州销售的电器产品。CEC认证的范围包括制冷设备、房间空调、中央空调、便携式空调、加热器、热水器、游泳池加热器、卫浴配件、光源、应急灯具、交通信号模块、灯具、洗碗机、洗衣机、干衣机、烹饪器具、电机和压缩机、变压器、外置电源、消费类电子设备
    张工nx808593 2025-02-27 18:04 120浏览
  • RGB灯光无法同步?细致的动态光效设定反而成为产品客诉来源!随着科技的进步和消费者需求变化,电脑接口设备单一功能性已无法满足市场需求,因此在产品上增加「动态光效」的形式便应运而生,藉此吸引消费者目光。这种RGB灯光效果,不仅能增强电脑周边产品的视觉吸引力,还能为用户提供个性化的体验,展现独特自我风格。如今,笔记本电脑、键盘、鼠标、鼠标垫、耳机、显示器等多种电脑接口设备多数已配备动态光效。这些设备的灯光效果会随着音乐节奏、游戏情节或使用者的设置而变化。想象一个画面,当一名游戏玩家,按下电源开关,整
    百佳泰测试实验室 2025-02-27 14:15 137浏览
  • 1,微软下载免费Visual Studio Code2,安装C/C++插件,如果无法直接点击下载, 可以选择手动install from VSIX:ms-vscode.cpptools-1.23.6@win32-x64.vsix3,安装C/C++编译器MniGW (MinGW在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序.)4,C/C++插件扩展设置中添加Include Path 5,
    黎查 2025-02-28 14:39 140浏览
  • 在物联网领域中,无线射频技术作为设备间通信的核心手段,已深度渗透工业自动化、智慧城市及智能家居等多元场景。然而,随着物联网设备接入规模的不断扩大,如何降低运维成本,提升通信数据的传输速度和响应时间,实现更广泛、更稳定的覆盖已成为当前亟待解决的系统性难题。SoC无线收发模块-RFM25A12在此背景下,华普微创新推出了一款高性能、远距离与高性价比的Sub-GHz无线SoC收发模块RFM25A12,旨在提升射频性能以满足行业中日益增长与复杂的设备互联需求。值得一提的是,RFM25A12还支持Wi-S
    华普微HOPERF 2025-02-28 09:06 143浏览
  • 一、VSM的基本原理震动样品磁强计(Vibrating Sample Magnetometer,简称VSM)是一种灵敏且高效的磁性测量仪器。其基本工作原理是利用震动样品在探测线圈中引起的变化磁场来产生感应电压,这个感应电压与样品的磁矩成正比。因此,通过测量这个感应电压,我们就能够精确地确定样品的磁矩。在VSM中,被测量的样品通常被固定在一个震动头上,并以一定的频率和振幅震动。这种震动在探测线圈中引起了变化的磁通量,从而产生了一个交流电信号。这个信号的幅度和样品的磁矩有着直接的关系。因此,通过仔细
    锦正茂科技 2025-02-28 13:30 100浏览
  •           近日受某专业机构邀请,参加了官方举办的《广东省科技创新条例》宣讲会。在与会之前,作为一名技术工作者一直认为技术的法例都是保密和侵权方面的,而潜意识中感觉法律有束缚创新工作的进行可能。通过一个上午学习新法,对广东省的科技创新有了新的认识。广东是改革的前沿阵地,是科技创新的沃土,企业是创新的主要个体。《广东省科技创新条例》是广东省为促进科技创新、推动高质量发展而制定的地方性法规,主要内容包括: 总则:明确立法目
    广州铁金刚 2025-02-28 10:14 103浏览
  • 更多生命体征指标风靡的背后都只有一个原因:更多人将健康排在人生第一顺位!“AGEs,也就是晚期糖基化终末产物,英文名Advanced Glycation End-products,是存在于我们体内的一种代谢产物” 艾迈斯欧司朗亚太区健康监测高级市场经理王亚琴说道,“相信业内的朋友都会有关注,最近该指标的热度很高,它可以用来评估人的生活方式是否健康。”据悉,AGEs是可穿戴健康监测领域的一个“萌新”指标,近来备受关注。如果站在学术角度来理解它,那么AGEs是在非酶促条件下,蛋白质、氨基酸
    艾迈斯欧司朗 2025-02-27 14:50 400浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦