初级c++编码规范
想了很久,第一篇文章还是应该写编码规范好一点。编码规范是一个仁者见仁的问题,为了避免复杂庞大,自己总结了一套简单版本的规范。
简介
本文介绍一份自己使用的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://zhgooglestyleguide.readthedocs.io/en/latest/ 这里是google建议的编码规范,包含C++,python,shell,objectivec
[2] https://blog.csdn.net/pleasecallmewhy/article/details/8658795 C++注释的规范参考了这里
初级c++编码规范的更多相关文章
- Day7:掌握APICloud应用管理相关服务的配置使用和相关API,包括:应用发布、版本管理、云修复、闪屏广告等。理解APICloud APP优化策略和编码规范;了解APICloud多Widget管理机制和SuperWebview的使用
主要内容: 1. 应用发布 1.1 云编译 1.2 全包加密 网页全包加密:对网页中全包的html,css,javascript代码进行加密,加密后的网友代码都是不可读的,并且不能通过常用的格式化工具 ...
- HTML/CSS/JS编码规范
最近整理了一份HTML/CSS/JS编码规范,供大家参考.目录:一.HTML编码规范二.CSS编码规范三.JS编码规范 一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签 ...
- Android的编码规范
一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Butt ...
- PHP 高级编程(1/5) - 编码规范及文档编写
PHP 高级程序设计学习笔记20140612 软件开发中的一个重要环节就是文档编写.他可以帮助未来的程序维护人员和使用者理解你在开发时的思路.也便于日后重新查看代码时不至于无从下手.文档还有一个重要的 ...
- 【原】JAVA SE编码规范
/* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...
- 浅谈Android编码规范及命名规范
前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...
- PHP编码规范PSR-2
.note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...
- Objective-C开发编码规范【转载】
概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序.关于Objective-C的编码规范,苹果和谷歌都已经有很好的总结: Apple Coding Guide ...
- 前端编码规范之CSS
"字是门面书是屋",我们不会去手写代码,但是敲出来的代码要好看.有条理,这还必须得有一点约束~ 团队开发中,每个人的编码风格都不尽相同,有时候可能存在很大的差异,为了便于压缩组件对 ...
随机推荐
- [Swift]LeetCode344. 反转字符串 | Reverse String
Write a function that takes a string as input and returns the string reversed. Example 1: Input: &qu ...
- [Swift]LeetCode393. UTF-8 编码验证 | UTF-8 Validation
A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules: For 1-byte char ...
- [Swift]LeetCode506. 相对名次 | Relative Ranks
Given scores of N athletes, find their relative ranks and the people with the top three highest scor ...
- [Swift]LeetCode565. 数组嵌套 | Array Nesting
A zero-indexed array A of length N contains all integers from 0 to N-1. Find and return the longest ...
- String补充
String类不可变和可变字符序列区别_字符串比较 String类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”.也就是指对象内部成员变量的值无法再改变, p ...
- 像素数据YUV简介与觉存储格式介绍
主要学习链接:博客园.51CTO 前言 照例是先废话几句,下面的内容都是在学习时从网上找来的,并非我原创,我之所以要写这篇笔记是因为网的内容都很分散,找的时候要从各个地方看,很不方便,所以就自己总结了 ...
- 北上广等一线城市IT岗位已接近饱和?
IT行业的技术者,时常被我们戏称为「IT民工」,虽然行业内巨大的人才需求和相对容易得到的高薪在源源不断的吸引各路人马加入,但它依旧在全球最缺人的十大行业中位居榜首. 我身边的朋友大都问过我这样一个疑问 ...
- mac openresty 源码安装 坑
下载openresty源码安装 下载页面http://openresty.org/cn/download.html 下载上一个版本的稳定版 https://openresty.org/download ...
- PHP 扩展管理
一直对 PHP 扩展了解的似是而非,每次安装扩展都要百度教程,很容易出现各种错误.所幸整理下管理扩展的所有操作,方便日后操作. 查看已加载的扩展 输出 phpinfo(): 使用 get_loaded ...
- 说一说MVC的CustomHandlerErrorAttribute(五)
九月第一篇,呵呵 前言:最近刚入职了一家公司,上司让我维护一个项目,我接手了看了一下项目,try catch 严重影响我的视觉,我直接通过vs插件将其try catch全部替换掉占位符,呵呵. 所以我 ...