代码规范:头文件规范

1.1 版本和版本声明

  1. 作用:形成版本跟踪和版本管控,
    1. 用以在实验过程和运维过程里遇到突发情况时即时回退
    2. 研发交付时,运维和甲方能够拿到成熟的产品项目
    3. 新人接入时能够快速上手
    4. 管理者在项目跟踪和项目改造时能够及时查看开发进度。
    5. 后续待添加
  2. 包含内容:
    (1)版权信息。
    (2)文件名称,标识符,摘要。
    (3)当前版本号,作者/修改者,完成日期。
    (4)版本历史信息。
  3. 样例示意:示例 1-1:
/*
* Copyright (c) 2022,北京象元气象观测技术研究院
* All rights reserved.
*
* 文件名称:XYHead.h
* 文件标识:见配置管理计划书
* 摘 要:进行公共的三方库的集中管理
*
* 当前版本:1.1
* 作 者:Zry
* 完成日期:2022年4月30日
*
* 取代版本:1.0
* 原作者 :Zry
* 完成日期:2022年4月29日
*/

1.2 头文件的结构

  1. 本节目的:
    1. 规范代码风格
    2. 便于他人阅读
  2. 头文件由三部分内容组成:
    1. 头文件开头处的版权和版本声明(参见示例 1-1)。
    2. 预处理块。
    3. 函数和类结构声明等
  3. 头文件书写规则建议:
    1. 规则 1-2-1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。
    2. 规则 1-2-2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
    3. 规则 1-2-3】用 #include "filename.h" 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
    4. 建议 1-2-1】头文件中只存放“声明”而不存放“定义”在 C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。
    5. 建议 1-2-2】不提倡使用全局变量,尽量不要在头文件中出现象 extern int value 这类声明。
    6. 建议 1-2-3】如果有自定义的结构体,请先在类前集中定义
    7. 建议 1-2-4】使用//=========结构体定义开始===========``//=========结构体定义结束===========的注释来规划整体的代码分块
  4. 代码示例:
/*
* Copyright (c) 2022,北京象元气象观测技术研究院
* All rights reserved.
*
* 文件名称:XYHead.h
* 文件标识:见配置管理计划书
* 摘 要:进行公共的三方库的集中管理
*
* 当前版本:1.1
* 作 者:Zry
* 完成日期:2022年4月30日
*
* 取代版本:1.0
* 原作者 :Zry
* 完成日期:2022年4月29日
*/

#ifndef XYHEAD_H // 防止 XYHead.h 被重复引用
#define XYHEAD_H

#include <math.h> //库文件引用和预处理块声明间隔开一行
// 引用标准库的头文件

…

#include “myheader.h” // 引用非标准库的头文件

…

//=============结构体定义开始=======================
/**
* 基础的消息结构体
*/
struct MsgData
{
	int iMsgId;
	char chMsgTest;
};
//=============结构体定义结束=======================

//=============类定义开始=======================

class Box // 类结构声明

{

…

};
//=============类定义结束=======================

//=============函数声明开始=======================
void Function1(…); // 全局函数声明

…
//=============函数声明结束=======================

#endif

1.3 定义文件的结构

  1. 定义文件有三部分内容:
    1. 定义文件开头处的版权和版本声明(参见示例 1-1)。
    2. 对一些头文件的引用。
    3. 程序的实现体(包括数据和代码)。

假设定义文件的名称为 XYworkMain.cpp,定义文件的结构参见示例

// 版权和版本声明见示例 1-1,此处省略。

#include “XYhead.h” // 引用头文件

…

// 全局函数的实现体

void Function1(…)

{

…

}

// 类成员函数的实现体

void Box::Draw(…)

{


…

}
  1. 建议:
    1. 如果是执行函数,使用bool类型作为返回值,告诉调用者执行结果
    2. 如果是重要函数,使用int类型作为返回值,告诉调用者错误种类
    3. 不要在代码中出现常量的比较,使用到的常量应使用宏的方式在头文件中集中定义。

1.4 头文件的作用

  1. 不必公布源码,提升保密性和安全性
    (1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只

要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库

功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

  1. 加快开发效率
    (2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件

中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错

的负担

1.5 目录结构

如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分

别保存于不同的目录,以便于维护。

例如可将头文件保存于 include 目录,将定义文件保存于 source 目录(可以是多级

目录)。

如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声

明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。

举例说明
目录结构:

Src
├── OpInclude
│   └── OpBase
└── OpModule
    ├── Algorithm
    ├── Connect
    └── FileSend

将代码放在Src下,公有的库文件调用写在OpInclude中,OpBase中写入框架设计代码

OpModule中写入业务功能 模块的代码。

从而实现了模块化的架构设计,当新增功能业务需求时,只需要改动添加模块部分,不需要整体重构,同时也将整体业务进行了拆分实现了精细化管理管理的条件。## 1.1 版本和版本声明

  1. 作用:形成版本跟踪和版本管控,
    1. 用以在实验过程和运维过程里遇到突发情况时即时回退
    2. 研发交付时,运维和甲方能够拿到成熟的产品项目
    3. 新人接入时能够快速上手
    4. 管理者在项目跟踪和项目改造时能够及时查看开发进度。
    5. 后续待添加
  2. 包含内容:
    (1)版权信息。
    (2)文件名称,标识符,摘要。
    (3)当前版本号,作者/修改者,完成日期。
    (4)版本历史信息。
  3. 样例示意:示例 1-1:
/*
* Copyright (c) 2022,北京象元气象观测技术研究院
* All rights reserved.
*
* 文件名称:XYHead.h
* 文件标识:见配置管理计划书
* 摘 要:进行公共的三方库的集中管理
*
* 当前版本:1.1
* 作 者:Zry
* 完成日期:2022年4月30日
*
* 取代版本:1.0
* 原作者 :Zry
* 完成日期:2022年4月29日
*/

1.2 头文件的结构

  1. 本节目的:
    1. 规范代码风格
    2. 便于他人阅读
  2. 头文件由三部分内容组成:
    1. 头文件开头处的版权和版本声明(参见示例 1-1)。
    2. 预处理块。
    3. 函数和类结构声明等
  3. 头文件书写规则建议:
    1. 规则 1-2-1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。
    2. 规则 1-2-2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
    3. 规则 1-2-3】用 #include "filename.h" 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
    4. 建议 1-2-1】头文件中只存放“声明”而不存放“定义”在 C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。
    5. 建议 1-2-2】不提倡使用全局变量,尽量不要在头文件中出现象 extern int value 这类声明。
    6. 建议 1-2-3】如果有自定义的结构体,请先在类前集中定义
    7. 建议 1-2-4】使用//=========结构体定义开始===========``//=========结构体定义结束===========的注释来规划整体的代码分块
  4. 代码示例:
/*
* Copyright (c) 2022,北京象元气象观测技术研究院
* All rights reserved.
*
* 文件名称:XYHead.h
* 文件标识:见配置管理计划书
* 摘 要:进行公共的三方库的集中管理
*
* 当前版本:1.1
* 作 者:Zry
* 完成日期:2022年4月30日
*
* 取代版本:1.0
* 原作者 :Zry
* 完成日期:2022年4月29日
*/

#ifndef XYHEAD_H // 防止 XYHead.h 被重复引用
#define XYHEAD_H

#include <math.h> //库文件引用和预处理块声明间隔开一行
// 引用标准库的头文件

…

#include “myheader.h” // 引用非标准库的头文件

…

//=============结构体定义开始=======================
/**
* 基础的消息结构体
*/
struct MsgData
{
	int iMsgId;
	char chMsgTest;
};
//=============结构体定义结束=======================

//=============类定义开始=======================

class Box // 类结构声明

{

…

};
//=============类定义结束=======================

//=============函数声明开始=======================
void Function1(…); // 全局函数声明

…
//=============函数声明结束=======================

#endif

1.3 定义文件的结构

  1. 定义文件有三部分内容:
    1. 定义文件开头处的版权和版本声明(参见示例 1-1)。
    2. 对一些头文件的引用。
    3. 程序的实现体(包括数据和代码)。

假设定义文件的名称为 XYworkMain.cpp,定义文件的结构参见示例

// 版权和版本声明见示例 1-1,此处省略。

#include “XYhead.h” // 引用头文件

…

// 全局函数的实现体

void Function1(…)

{

…

}

// 类成员函数的实现体

void Box::Draw(…)

{


…

}
  1. 建议:
    1. 如果是执行函数,使用bool类型作为返回值,告诉调用者执行结果
    2. 如果是重要函数,使用int类型作为返回值,告诉调用者错误种类
    3. 不要在代码中出现常量的比较,使用到的常量应使用宏的方式在头文件中集中定义。

1.4 头文件的作用

  1. 不必公布源码,提升保密性和安全性
    (1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只

要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库

功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

  1. 加快开发效率
    (2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件

中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错

的负担

1.5 目录结构

如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分

别保存于不同的目录,以便于维护。

例如可将头文件保存于 include 目录,将定义文件保存于 source 目录(可以是多级

目录)。

如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声

明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。

举例说明
目录结构:

Src
├── OpInclude
│   └── OpBase
└── OpModule
    ├── Algorithm
    ├── Connect
    └── FileSend

将代码放在Src下,公有的库文件调用写在OpInclude中,OpBase中写入框架设计代码

OpModule中写入业务功能 模块的代码。

从而实现了模块化的架构设计,当新增功能业务需求时,只需要改动添加模块部分,不需要整体重构,同时也将整体业务进行了拆分实现了精细化管理管理的条件。


服务器高级架构体系:https://ke.qq.com/course/417774?flowToken=1010783

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值