代码规范:头文件规范

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

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

目录
相关文章
|
Unix Linux 编译器
Linux创建临时文件mkstemp()tmpfile()
有些程序需要创建一些临时文件,仅供其在运行期间使用,程序终止后即行删除。 很多编译器程序会在编译过程中创建临时文件。GNU C 语言函数库为此而提供了一系列库函数。(之所以有“一系列”的库函数,部分原因是由于这些函数分别继承自各种 UNIX 实现。)本节将介绍其中的两个函数:mkstemp()和 tmpfile()。
548 0
Linux创建临时文件mkstemp()tmpfile()
|
9月前
|
存储 芯片 异构计算
南京观海微电子---MIG IP核的使用——DDR接口专栏(二)
本文介绍Xilinx FPGA中MIG IP核的使用方法,涵盖DDR3颗粒选型、FPGA匹配、MIG参数配置及管脚分配等关键步骤,帮助用户实现对片外DDR存储器的高效读写操作。
南京观海微电子---MIG IP核的使用——DDR接口专栏(二)
|
存储 缓存 Linux
内存系列学习(六):ARM处理器存储访问一致性问题
内存系列学习(六):ARM处理器存储访问一致性问题
2250 0
|
Linux 芯片
一篇文章讲明白Linux下控制GPIO的三种方法
一篇文章讲明白Linux下控制GPIO的三种方法
3108 3
|
存储 缓存 算法
【Conan 入门教程】从零开始编写第一个自定义部署器
【Conan 入门教程】从零开始编写第一个自定义部署器
857 1
|
Ubuntu 关系型数据库 MySQL
Mysql8.0在Ubuntu安装
Mysql8.0在Ubuntu安装
|
网络协议 开发工具 Perl
【ZYNQ】裸机 PS + PL 双网口实现之 SDK 程序设计
【ZYNQ】裸机 PS + PL 双网口实现之 SDK 程序设计
1555 0
|
存储 JSON NoSQL
|
机器学习/深度学习 Java Android开发
记录一个Flutter运行的异常FAILURE: Build failed with an exception. What went wrong: A problem occurred config
记录一个Flutter运行的异常FAILURE: Build failed with an exception. What went wrong: A problem occurred config
1111 0
|
Linux 网络安全 数据安全/隐私保护
使用Buildroot为I.MX6制作根文件系统(下)
使用Buildroot为I.MX6制作根文件系统