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

简介

    本文介绍一份自己使用的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]LeetCode705. 设计哈希集合 | Design HashSet

    Design a HashSet without using any built-in hash table libraries. To be specific, your design should ...

  2. BBS论坛(十八)

    18.首页轮播图实现 (1)front/css/front_base.css .main-container{ width: 990px; margin: 0 auto; overflow: hidd ...

  3. 理解JavaScript的临时包装对象

    Javascript语言中的对象和基础类型string.number.boolean都可以使用"."符号访问属性和方法,但是本质上只有对象才可以使用".",那么 ...

  4. Django2.0版本 path与Django1.x版本url正则匹配问题

    Django1.x版本url正则匹配如下: Django2.0版本正则匹配则要导入re_path模块如下:

  5. Elasticsearch 分词器

    无论是内置的分析器(analyzer),还是自定义的分析器(analyzer),都由三种构件块组成的:character filters , tokenizers , token filters. 内 ...

  6. Python爬虫入门教程 6-100 蜂鸟网图片爬取之一

    1. 蜂鸟网图片--简介 国庆假日结束了,新的工作又开始了,今天我们继续爬取一个网站,这个网站为 http://image.fengniao.com/ ,蜂鸟一个摄影大牛聚集的地方,本教程请用来学习, ...

  7. Java基础10:全面解读Java异常

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  8. Asp.Net SignalR - 持久连接类

    持久连接类 通过SignalR持久连接类可以快速的构建一个即时通讯的应用,上篇博文已经我们创建一个owin Startup类和一个持久连接类来完成我们的工作,然后在Startup类的Configura ...

  9. 【Java基础】【22IO(其他流)&Properties】

    22.01_IO流(序列流)(了解) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方 ...

  10. leetcode — best-time-to-buy-and-sell-stock-iii

    /** * Source : https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/ * * * Say you h ...