代码规范:头文件规范

简介: 用以在实验过程和运维过程里遇到突发情况时即时回退研发交付时,运维和甲方能够拿到成熟的产品项目新人接入时能够快速上手

1.1 版本和版本声明

1.作用:形成版本跟踪和版本管控,

  1. 用以在实验过程和运维过程里遇到突发情况时即时回退
  2. 研发交付时,运维和甲方能够拿到成熟的产品项目
  3. 新人接入时能够快速上手
  4. 管理者在项目跟踪和项目改造时能够及时查看开发进度。
  5. 后续待添加

2.包含内容:

(1)版权信息。

(2)文件名称,标识符,摘要。

(3)当前版本号,作者/修改者,完成日期。

(4)版本历史信息。

样例示意:示例 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. 本节目的:
  2. 规范代码风格
  3. 便于他人阅读

2.头文件由三部分内容组成:

  1. 头文件开头处的版权和版本声明(参见示例 1-1)。
  2. 预处理块。
  3. 函数和类结构声明等

3.头文件书写规则建议:

  1. 【规则 1-2-1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。
  2. 【规则 1-2-2】用 #include  格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
  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】使用//=========结构体定义开始===========``//=========结构体定义结束===========的注释来规划整体的代码分块

代码示例:

/*
* 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)。

对一些头文件的引用。

程序的实现体(包括数据和代码)。

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


// 版权和版本声明见示例 1-1,此处省略。
#include “XYhead.h” // 引用头文件
// 全局函数的实现体
void Function1(…)
{
}
// 类成员函数的实现体
void Box::Draw(…)
{
}

建议:

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

1.4 头文件的作用

不必公布源码,提升保密性和安全性

(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只

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


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


加快开发效率

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

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


的负担


1.5 目录结构

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


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


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


目录)。


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


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


举例说明:

目录结构:

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

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


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


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


作用:形成版本跟踪和版本管控,

  1. 用以在实验过程和运维过程里遇到突发情况时即时回退
  2. 研发交付时,运维和甲方能够拿到成熟的产品项目
  3. 新人接入时能够快速上手
  4. 管理者在项目跟踪和项目改造时能够及时查看开发进度。

后续待添加

包含内容:

(1)版权信息。

(2)文件名称,标识符,摘要。

(3)当前版本号,作者/修改者,完成日期。

(4)版本历史信息。

样例示意:示例 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)。

预处理块。

函数和类结构声明等

头文件书写规则建议:

【规则 1-2-1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。

【规则 1-2-2】用 #include  格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。

【规则 1-2-3】用 #include "filename.h" 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。

【建议 1-2-1】头文件中只存放“声明”而不存放“定义”在 C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。

【建议 1-2-2】不提倡使用全局变量,尽量不要在头文件中出现象 extern int value 这类声明。

【建议 1-2-3】如果有自定义的结构体,请先在类前集中定义

【建议 1-2-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)。

对一些头文件的引用。

程序的实现体(包括数据和代码)。

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


// 版权和版本声明见示例 1-1,此处省略。
#include “XYhead.h” // 引用头文件
// 全局函数的实现体
void Function1(…)
{
}
// 类成员函数的实现体
void Box::Draw(…)
{
}

建议:

如果是执行函数,使用bool类型作为返回值,告诉调用者执行结果

如果是重要函数,使用int类型作为返回值,告诉调用者错误种类

不要在代码中出现常量的比较,使用到的常量应使用宏的方式在头文件中集中定义。

1.4 头文件的作用

不必公布源码,提升保密性和安全性

(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只

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


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


加快开发效率

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

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


的负担


1.5 目录结构

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


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


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


目录)。


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


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


举例说明:

目录结构:

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

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


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


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


服务器高级架构体系:https://xxetb.xet.tech/s/4DEnTI

目录
相关文章
|
设计模式 编解码 算法
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(三)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
278 0
|
5月前
|
机器学习/深度学习 人工智能 并行计算
《算力觉醒!ONNX Runtime + DirectML如何点燃Windows ARM设备的AI引擎》
ONNX Runtime 是一个跨平台高性能推理引擎,可运行不同框架转为 ONNX 格式的模型,通过深度分析与优化计算图提升效率。在 Windows ARM 设备上,它针对硬件特性优化,结合微软 DirectML API,充分利用 GPU 并行计算能力加速 AI 推理。两者深度融合,灵活调整参数以满足实时性或高精度需求,在文本分类、图像识别、智能安防等领域显著提升性能,为多样化应用场景提供高效支持。
190 16
|
消息中间件 测试技术 领域建模
DDD - 一文读懂DDD领域驱动设计
DDD - 一文读懂DDD领域驱动设计
39072 5
|
存储 程序员 C语言
C语言的错误处理机制
C语言的错误处理机制
|
12月前
|
Ubuntu 网络协议 网络安全
Ubuntu 防火墙UFW使用方式
Ubuntu 防火墙UFW使用方式
272 1
|
12月前
|
算法 程序员 开发工具
C语言编程规范
C 语言编程规范有助于提升代码的可读性、可维护性和可移植性。主要包括:命名规范(如 `my_variable`、`MAX_SIZE`)、代码缩进与空格、注释(解释逻辑但不过度)、函数设计(短小精悍、参数不超过三个)、错误处理、避免魔法数字、选择合适数据结构、使用标准库、保持代码格式一致及版本控制。遵循这些规范能显著提高团队开发效率和代码质量。
1063 2
|
监控 Devops 测试技术
DevOps实践: 持续集成和持续部署(CI/CD)的入门指南
【9月更文挑战第10天】在快速迭代的软件开发世界中,DevOps已经成为加速产品交付、提升软件质量和团队协作的关键策略。本文将深入浅出地介绍DevOps的核心组成部分——持续集成(Continuous Integration, CI)与持续部署(Continuous Deployment, CD)的基本概念、实施步骤以及它们如何革新传统的软件开发流程。你将学习到如何通过自动化工具简化开发流程,并理解为什么CI/CD是现代软件开发不可或缺的一环。
|
Rust API Python
Python Requests 库中的重试策略实践
在网络请求中,由于网络波动或服务暂时不可达等原因,请求可能失败。为增强客户端健壮性,自动重试机制变得尤为重要。本文介绍如何在 Python 的 `requests` 库中实现请求自动重试,通过 `urllib3` 的 `Retry` 类配置重试策略,并提供了一个具体示例,展示了如何设置重试次数、状态码集合及异常类型等参数,从而提高系统的可靠性和容错能力。
493 3
|
JSON Linux C语言
全网最权威唯一值得推荐的《C/C++框架和库》
关于C++框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。
463 1
|
人工智能 自然语言处理 开发者
Claude 3系列包含Haiku(低)、Sonnet(中)和Opus(高)三个模型
Claude 3系列包含Haiku(低)、Sonnet(中)和Opus(高)三个模型
775 1