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

简介

    本文介绍一份自己使用的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. [Swift]LeetCode713. 乘积小于K的子数组 | Subarray Product Less Than K

    Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...

  2. 14.Git分支-rebase有趣的例子、变基带来的问题及解决方案

    1.有趣的变基例子 如下图所示,你创建了一个特性分支server,然后进行了一些提交(C3和C4),然后又从C3上创建了特性分支client,提交了C8和C9,最后你又回到了server,提交了C10 ...

  3. Ocelot中使用Butterfly实践

    Ocelot(https://github.com/TomPallister/Ocelot)是一个用.net core实现的API网关,Butterfly(https://github.com/But ...

  4. spring框架应用系列二:component-scan自动扫描注册装配

    component-scan自动扫描注册装配 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7717331.html ...

  5. 【转载】ASP.NET Core 依赖注入

    本文转自:http://www.jessetalk.cn/2017/11/06/di-in-aspnetcore/ 为什么要写这个博客 DI在.NET Core里面被提到了一个非常重要的位置, 这篇文 ...

  6. 设计模式总结篇系列:单例模式(SingleTon)

    在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式.适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象.如Android中常见的Application对象. ...

  7. 谈谈iOS获取调用链

    本文由云+社区发表 iOS开发过程中难免会遇到卡顿等性能问题或者死锁之类的问题,此时如果有调用堆栈将对解决问题很有帮助.那么在应用中如何来实时获取函数的调用堆栈呢?本文参考了网上的一些博文,讲述了使用 ...

  8. 深度学习入门实战(一):像Prisma一样算法生成梵高风格画像

    本文由云+社区发表 作者:董超 导语:现在人工智能是个大热点,而人工智能离不开机器学习,机器学习中深度学习又是比较热门的方向,本系列文章就从实战出发,介绍下如何使用MXnet进行深度学习~ 既然是实战 ...

  9. Linux 进程管理工具 supervisord 安装及使用

    Supervisor是用Python实现的一款非常实用的进程管理工具 1.安装过程非常简单 安装python 安装meld3-0.6.8.tar.gz 安装supervisor-3.0a12.tar. ...

  10. 通过 Ansible 安装 Docker

    本文的演示环境为 ubuntu 16.04. 先在 Ansible Galaxy 搜索 docker,由 geerlingguy 贡献的 docker role 是目前最受欢迎的: 通过 ansibl ...