想了很久,第一篇文章还是应该写编码规范好一点。编码规范是一个仁者见仁的问题,为了避免复杂庞大,自己总结了一套简单版本的规范。

简介

    本文介绍一份自己使用的C++编码规范。第一次正式进入软件行业(第一份工作)是13年,经过这些年的磕磕碰碰,现在深刻认同编码规范的重要性。本文总结的是自己使用的编码规范中的命名规范,该规范主要来自于”google的开源代码编码规范“,少数几个地方根据自己的理解进行了调整。

注释

    文件头注释示例:

/*************************************************
* Copyright (c) 2016, Zhangping.
* All rights reserved.
*
* Author:why
* E-mail:bluepc_2013@163.com
* Date :2016-08-25
* Brief :Something about C++
**************************************************/ 

    其中,表示版权起始日期是2016年,版权所有者是zhangping。对于一个公司,其声明格式为“Copyright (c) 2016, Zhangping, Inc.” 后面的"Inc"是公司的缩写。

    函数头部注释示例:

/*************************************************
* Function: // 函数名称
* Brief: // 函数功能、性能等的描述
* Calls: // 可选,被本函数调用的函数清单
* Table Accessed: // 可选,被访问的表(此项仅对于牵扯到数据库操作的程序)
* Table Updated: // 可选,被修改的表(此项仅对于牵扯到数据库操作的程序)
* Input: // 输入参数说明,包括每个参数的作
* // 用、取值说明及参数间关系。
* Output: // 对输出参数的说明,这里的输出参数包括一些用于输出计算
* // 结果的形参。
* Return: // 函数返回值的说明
* Others: // 其它说明
*************************************************/

    其他地方(例如:类)也采用相似的方式来添加注释,但应该简单明了。

字符串分行

    一行代码的长度不应该超过80个字符。对于长字符串,下面示例了两种分行方法,

#include <iostream>
int main(){
// Method 1:
// a).'\'贴着最后一个字符
// b).第二行不能有空格或Tab
std::cout<<"aaaaaaaa\
aa"<<std::endl;
// Method 2:
std::cout<<"bbbbbb"
"bbbbbbb"<<std::endl;
return 0;
}

    个人推荐第二种,因为第一种使代码排版变得不工整。

头文件的#define保护

    定义名应该采用“工程名 + 路径 + 文件名”的组合方式,且尽量使用全称。下面是一个头文件保护的示例,

#ifndef PROJECT_PATH_FILE_H_
#define PROJECT_PATH_FILE_H_
...
#endif

文件命名

    文件名要全部小写,可以包含下划线(_)。例如:imu_device.cc。c++源文件要以 “.cc” 结尾,头文件以".h"结尾。

类型命名

    所有类型命名­­类,结构体,类型定义(typedef),枚举,类型模板参数­­均使用相同约定。以大写字母开始,每个单词首字母均大写(仅仅首字母大写,例如:DNS应该写为Dns),不包含下划线。示例如下:

// 类和结构体
class UrlTable {...}
class UrlTableTester {...}
struct UrlTableProperties {...}
// 类型定义
typedef hash_map<UrlTableProperties *, string> PropertiesMap;
// Using 别名
using PropertiesMap = hash_map<UrlTableProperties *, string>
// 枚举
enum UrlTableErrors {...}

变量命名

    变量(包括:局部变量,函数形参)和数据成员名一律小写,单词之间用下划线连接。类的成员变量以下划线结尾。结构体的成员变量不要用下划线结尾。示例如下,

// 普通变量
string table_name // 用下划线分割
// 类数据成员
class TableInfo {
...
private:
string table_name_; // 用下划线结尾
static string table_name2_; // 静态成员变量依然下划线结尾
};
// 结构体数据成员
struct TableInfo{
string table_name; // 命名方式同普通变量
static string table_name2;
};

    这种命名方式能带来一些便利。例如:写了一个类QueryResult后,可以直接定义一个变量query_result,区分度是很好的;另外,类内变量以下划线结尾,那么就可以直接传入同名的形参,使用起来简单明了。

常量命名

    声明为constexpr或const的变量,命名时以"k"开头,大小写混合。例如:

const int kDaysInAWeek = 7;

    这种明显差异于普通变量的命名方式,用以提醒阅读者该变量是一个常量。

静态变量

    声明在局部范围(例如:函数内)的静态变量,命名时以"s"开头,大小写混合。例如:

void fun(){
...
static int sDayInAWeek = 7;
}

    看到该标志,应该立刻注意到该变量能记忆上次调用的值。

全局变量

    全局变量命名时以"g"开头,大小写混合。如果一个变量即是全局变量,也是static类型,则此时也应该使用"g"开头。因为全局变量标志比静态变量标志提供了更多的信息(具体原因见下面的说明)。示例,

i   nt gDayInAWeek = 7;
static int gDayInAWeek = 7;
...
int main(){
...
}

    看到"g"标志,应该立刻注意到该变量来自这个程序片的外部,该变量除了在当前程序片上被修改(即记忆上次调用的值),还可能在其他地方被修改。这也是为什么静态全局变量使用标识"g"的原因。

函数命名

    常规函数使用大小写混合,取值和设值函数则采用与普通变量名一致的命名规则。例如:

// 常规函数
void MyFunction();
// 取值和设值函数
int get_my_variable();
void set_my_variable(int);

    这个差异一方面是为了美观,另一方面也能提醒读者函数的差异。常规函数内部包含一定的程序逻辑,而取值和设值函数则没有。一般来说,只有成员变量会有取值和设值函数,所以采用了近似于成员变量的命名方式。如果需要为全局变量设置这两个函数时,也可以采用这种命名方式。因为只有需要借用外部文件的全局变量时才会设置这两个函数,此时是没有必要区分是否是全局变量的(如果采用全局变量的命名方式来命名这两个函数,反而容易引起其他麻烦)。

命名空间命名

    命名空间以小写字母命名,以下划线分割(类似于普通变量命名)。尽量不要缩写,因为缩写可能导致与其他库(或代码)的命名空间重名,而且命名空间中的代码极少需要涉及命名空间的名称,因此没有必要使用缩写。示例如下,

namespace my_name_space{
...
}

枚举命名

    枚举类型采用类class的方式命名(首字母大写,大小写混合) ,枚举值采用常量的方式命名(k开头,后面大小写混合)。示例如下,

/* 枚举类型示例 */
enum ErrorTypes{
kOK = 0,
kErrorOutOfMemory,
kErrorOther,
};
int main(){
ErrorTypes type = kOK
type = kErrorOther;
return 0;
}

    枚举值与常量的使用方式和特性相似,所以采用相同的命名方式。另外,也考虑过将枚举值采用“全大写,下划线分割”的方式命名,但那种命名方式有可能与宏冲突,所以放弃。

宏命名

    宏应该尽量少用,一般可以用常量替代。如果确实要使用,建议采用“全大写,下划线”分割的方式命名。示例如下,

#define PI_ROUNDED 3.0

Reference

    [1] http://zh­google­styleguide.readthedocs.io/en/latest/ 这里是google建议的编码规范,包含C++,python,shell,objective­c

    [2] https://blog.csdn.net/pleasecallmewhy/article/details/8658795 C++注释的规范参考了这里

初级c++编码规范的更多相关文章

  1. Day7:掌握APICloud应用管理相关服务的配置使用和相关API,包括:应用发布、版本管理、云修复、闪屏广告等。理解APICloud APP优化策略和编码规范;了解APICloud多Widget管理机制和SuperWebview的使用

    主要内容: 1. 应用发布 1.1 云编译 1.2 全包加密 网页全包加密:对网页中全包的html,css,javascript代码进行加密,加密后的网友代码都是不可读的,并且不能通过常用的格式化工具 ...

  2. HTML/CSS/JS编码规范

    最近整理了一份HTML/CSS/JS编码规范,供大家参考.目录:一.HTML编码规范二.CSS编码规范三.JS编码规范 一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签 ...

  3. Android的编码规范

    一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Butt ...

  4. PHP 高级编程(1/5) - 编码规范及文档编写

    PHP 高级程序设计学习笔记20140612 软件开发中的一个重要环节就是文档编写.他可以帮助未来的程序维护人员和使用者理解你在开发时的思路.也便于日后重新查看代码时不至于无从下手.文档还有一个重要的 ...

  5. 【原】JAVA SE编码规范

    /* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...

  6. 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...

  7. PHP编码规范PSR-2

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  8. Objective-C开发编码规范【转载】

    概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序.关于Objective-C的编码规范,苹果和谷歌都已经有很好的总结: Apple Coding Guide ...

  9. 前端编码规范之CSS

    "字是门面书是屋",我们不会去手写代码,但是敲出来的代码要好看.有条理,这还必须得有一点约束~ 团队开发中,每个人的编码风格都不尽相同,有时候可能存在很大的差异,为了便于压缩组件对 ...

随机推荐

  1. java中this和super关键字的使用

    这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this ...

  2. 阿里云服务器公网Ip外网无法访问

    拥有了自己的服务器后,发现需要各种配置,之前应用公司的服务器的时候,一般通过内网访问,或者外网访问时,很多配置其他人员都已经配置好了,但是现在在自己的服务器上发布自己的网站的时候,才发现事情并没有自己 ...

  3. JDBC编程,从入门到精通

    今天突然想多说两句,刚刚在知乎看到一个人说,在当今世界,没有技术型驱动的公司,全都是业务型.即便是表面上看似技术型公司,其本质还是为了服务业务.这段话推翻了我以前关于编程的所有看法,觉得颇有道理.下面 ...

  4. C#版 - Leetcode 201. 数字范围按位与(bitwise AND) - 题解

    C#版 - Leetcode 201. 数字范围按位与(bitwise AND) - 题解 在线提交: https://leetcode.com/problems/bitwise-and-of-num ...

  5. JAVA实现接口监控报警系统

    公司一内部系统需要添加一个接口和定时任务监控机制,针对了系统出现的定时任务没有执行,定时任务执行异常出错,对外传送的数据接口异常出错,对内的系统数据互传异常出错等问题进行设计,目的是为了能够让用户没发 ...

  6. Linux~上部署.net MVC出现的问题与解决

    这几天一直在搞linux下面的.net mvc的部署工作,遇到了很多问题,还好有一些朋友的帮助,问题才得到了解决! 环境:Linux+Mono+Jexus 希望的结果:直接运行windows+vist ...

  7. 使用mpvue开发小程序教程(六)

    在上一章节中,我们列举了在Vue中能用但在mpvue中不能用或需要特别注意的特性,在实际开发前了解一下还是很有必要的,可以避免浪费找错误的时间. 如果你使用过原生的小程序框架,你一定经历过或思考过怎么 ...

  8. 如何理解git checkout -- file和git reset HEAD -- file

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374831943254ee ...

  9. 系统开发中使用拦截器校验是否登录并使用MD5对用户登录密码进行加密

    项目名称:客户管理系统 项目描述: 项目基于javaEE平台,B/S模式开发.使用Struts2.Hibernate/Spring进行项目框架搭建.使用Struts中的Action 控制器进行用户访问 ...

  10. Django学习笔记(1)——初识Django

    一:Web框架介绍 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以快速帮你开发特定的系统. Web框架是别人已经设定好的一个web网站模板,你学习它 ...