文章目录

  • 1.目录与文件命名
  • 2.类型命名
  • 3.名字空间命名
  • 4.函数命名
  • 5.变量命名
  • 6.枚举与宏命名
  • 7.小结
  • 参考文献

一个大型项目,参与开发人员众多,每个人的编码风格迥异,为保持代码风格统一,提高代码可读性与可维护性,一个重要的约定就是命名方式。良好统一的命名方式能让我们在不需要去查找类型声明的条件下快速了解某个名字代表的含义。命名涉及目录、文件、名字空间、类型、函数、变量、枚举、宏等等。事实上,我们对代码的理解和认知是非常依赖这些命名方式。

关于命名方式,一个通用规则就是名称应具有描述性,少用缩写。尽可能使用描述性的命名, 别心疼空间,毕竟相比之下让代码易于新读者理解更重要,不要用只有项目开发者才能理解的缩写,也不要通过砍掉几个字母来缩写单词。比如:

int priceCountReader;        //无缩写
int numErrors;              //num是一个常见的写法
int numDnsConnections;      //人人都知道 "DNS" 是什么
int n;                      //毫无意义
int nerr;                   //含糊不清的缩写
int nCompConns;             //含糊不清的缩写
int wgcConnections;         //只有贵团队知道wgc是什么意思
int pcReader;               //pc有太多可能的解释了
int cstmrId;                //删减了若干字母

注意,一些特定的广为人知的缩写是允许的,例如用 i 表示迭代变量和用 T 表示模板参数。模板参数的命名应当遵循对应的分类:类型模板参数应当遵循类型命名的规则,非类型模板应当遵循变量命名的规则。

命名规则具有一定随意性,最重要的是坚持一致性,无论你认为它们是否重要,规则总归是规则,我们应该遵守,不建议在代码中过于展示个人与众不同的风格。

1.目录与文件命名

目录与文件名建议全部小写,以下划线分隔,可接受的目录与文件命名示例:

my_userful_class     //目录
my_useful_class.h       //头文件
my_userful_class.inc    //插入文件
my_useful_class.cpp     //源文件

目录与文件命名规则相同,C++源文件以.cpp结尾,头文件以.h结尾,专门插入文本的文件则以 .inc 结尾。命名时,不要使用已经存在于/usr/include下的文件名,即不要与系统头文件和标准库头文件同名,如stdlib.h。

通常应尽量让文件名更加明确,比如http_server_logs.h就比logs.h要好,定义类时文件名一般成对出现,比如foo_bar.h 和 foo_bar.cpp,对应于类FooBar。

2.类型命名

类型命名应该以帕斯卡命名法(Pascal 命名法)为准,又称大驼峰式命名法(Upper Camel Case命名法),类型名称的每个单词首字母均大写, 不包含下划线。所有类型命名 —— 类、结构体、枚举、类型定义(typedef)、类型模板参数,均使用相同约定。例如:

// 类和结构体
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...// 类型定义
typedef hash_map<UrlTableProperties *, string> PropertiesMap;// using 别名
using PropertiesMap = hash_map<UrlTableProperties *, string>;// 枚举
enum UrlTableErrors { ...// 模板参数
template<typename Type> void fooFunc(Type t);

3.名字空间命名

(1)名字空间推荐使用“全小写+下划线”命名方式;
(2)顶级名字空间的名字取决于项目名称;
(3)由于名称查找规则的存在,名字空间之间的冲突完全有可能导致编译失败,所以要注意避免嵌套名字空间的名字之间和常见的顶级名字空间和标准库中名字空间的名字发生冲突,如不要创建嵌套的同名std 名字空间;
(4)不使用缩写作为名称的规则同样适用于名字空间。

示例如下:

namespace web_search {...
}

4.函数命名

一般来说,函数(不管是全局函数还是类成员函数)名的命名方式与变量命名方式相同,采用小驼峰式命名法(Lower Camel Case命名法), 第一个单词首字母小写,后面的单词首字母大写,没有下划线。对于首字母缩写的单词, 更倾向于将它们视作一个单词进行首字母大写。示例如下:

addTableEntry()
deleteUrl()
openFileOrDie()
StartRpc()      //而非 StartRPC()。

5.变量命名

变量(包括函数参数)和数据成员(不管是静态的还是非静态)名推荐使用小驼峰式命名法。举例:

string tableName;class TableInfo {...
private:string table_name;              // 不好,不建议使用下划线string tableName;              // 好,小驼峰式命名法static Pool<TableInfo>* pool;      // 好
};

注意,声明为constexpr或const的变量,或在程序运行期间其值始终保持不变的常量,命名时以“const”开头,例如:

const int constDaysInAWeek = 7;

6.枚举与宏命名

枚举命名和宏命名方式一致,采用“全大写+下划线”的命名方式。下面示例中枚举名 UrlTableErrors 是类型,所以采用Pascal命名方法。

// 枚举命名
enum AlternateUrlTableErrors {OK = 0,OUT_OF_MEMORY = 1,MALFORMED_INPUT = 2
};// 宏命名
#define ROUND(x) ...
#define PI_ROUNDED 3.0

7.小结

以上推荐的命名方式仅供参考,并非教条,但必须要遵守的一点就是一个项目中的命名方式一定要统一,不出现散乱分化的局面,不然代码看起来将杂乱不堪。所以,在接手一个旧项目时,命名方式要与现有代码风格保持一致。

除了上文中提及的四种命名方式(“全小写+下划线”、“全大写+下划线”、Pascal命名法、小驼峰式命名法 ),业界还有一种较为流行的变量命名方法叫匈牙利命名法,是由一位祖籍为匈牙利的杰出前微软程序员查尔斯-西蒙尼(Charles Simonyi)提出的,广泛应用于Windows环境编程中。该命名法大致规则是在每个变量名的前面加上若干表示数据属性和类型的前缀。基本原则是:变量名=属性+类型+对象描述。如d表示int,所有d开头的变量命都表示int类型。s表示char*,所有变量命以s开头的都表示C风格字符串,以g_开头的表示全局变量,以s_开头的表示静态变量,m_开头的表示类数据成员等。那么g_dAge,则表示一个int类型的全局变量。


参考文献

Google C++编程风格指南
wikipedia.帕斯卡命名法
widipedia.匈牙利命名法

C++ 命名方式建议相关推荐

  1. 五大晶元厂的内存型号命名方式

    选择内存 选择内存,最重要的是看颗粒.要想与品牌机的原配内存完美兼容,最好使用相同颗粒的内存条. 相信很多网友会问:什么是内存颗粒?依照笔者的理解:内存颗粒形象来说,就是内存PCB板上的黑色小方块.内 ...

  2. 你应该了解的CSS语义化命名方式及常用命名规则

    CSS语义化命名 从上图我们可以大概看出这里有两种CSS的命名方式:1.结构化命名法:2.语义化命名法. 结构化命名法:根据页面中板块的位置而命名,如上图中的content-left,这时如果我们想把 ...

  3. css规则中区块block,CSS的命名方式:BEM(区块、元素、修饰符)

    原标题:CSS的命名方式:BEM(区块.元素.修饰符) 本资源由 伯乐在线- 凝枫整理,您也想贡献一份力量?欢迎加入我们 » 重要概念 "Block"区块 区块的定义是:一个逻辑和 ...

  4. 2022-08-02 乐理知识(一) 简谱的调号——简谱构造,唱名和音名,钢琴琴键的分组和命名方式,调号,全音和半音,调式,自然大调,C大调,音阶

    文章目录 0.教程地址 一.简谱的构造,唱名,音名和调式 1.简谱的构造 2.什么是唱名?什么是音名?两者的区别和联系是什么? 唱名,顾名思义就是唱出来的调调:唱做"哆来咪发梭拉西多&quo ...

  5. 五大品牌笔记本命名方式大揭秘

    不知道你有没有这样的感觉,在选购笔记本时,会发现有的品牌笔记本型号特别长,那一串串字母和数字让人看着眼花缭乱,但其中又好像暗藏玄机,每个字母都代表着特定的含义.那么,我们有没有办法把它们解读出来呢?答 ...

  6. 组件命名方式||局部组件注册:局部组件只能在注册他的父组件中使用

    组件命名方式 组件注册注意事项                 如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的方式使用组件,但是                 在普通的标签 ...

  7. linux最常用的目录表示,Linux磁盘分区的命名方式和常用目录?【每日一个知识点第84期-Linux】...

    磁盘分区对于入门的linux来说,是非常入门的技能,也是日常管理中常用技能之一,今天我们来做一个回顾,帮助大家提升磁盘分区的技能. [84期主题]Linux磁盘分区的命名方式和常用目录? Linux分 ...

  8. oracle数据库连接名是什么,连接到Oracle数据库的几种命名方式

    连接到Oracle数据库的几种命名方式 从事 Oracle 相关工作的人,每天都会使用各种工具连接到 Oracle 数据库,比如:SQL*Plus.PL/SQL.TOAD.SQLDeveloper 等 ...

  9. 一个小例子介绍Obj-C的函数命名方式

    对于以前做C#或者JAVA开发的朋友而言,初次接触iOS开发,Obj-C的函数命名方式可能会感觉非常不习惯. 尤其是打开AppDelegate.m,映入眼帘的代码竟然是: - (BOOL)applic ...

最新文章

  1. 中国IT潜在的巨大希望
  2. struts 页面取值问题
  3. 在 Windows 上像 Linux 一样使用命令
  4. 【转】SVN 与 GIT 详细对比
  5. centos6.4 源码安装mysql5.5
  6. centos6安装mysql并远程连接_Ubantu下MySQL安装、部署和远程连接
  7. Android-HIDL实例解析
  8. JAVA面试要点004_JAVA编程过程中为了性能优化_应该注意到的地方
  9. python3 数组转字符串_Q:与python3交互中字符串转gbk的问题
  10. 挖矿仍然有利可图吗?
  11. mysql sql语句 datediff_MySQL数据库之MySQL DATEDIFF 函数
  12. iPhone清理喇叭灰尘_手机喇叭用久了灰尘多,与其经常换手机,不如自己动手清理...
  13. Java、JSP宾馆入住管理系统的设计与实现
  14. 20春季 7-2 The Judger (25 分)
  15. mysql删表数据不删表结构_在SQL中删除表数据和删除表结构有什么不同
  16. Python爬取煎蛋网多页的图片
  17. 高维空间中的体积(包含递归思想的初步理解)
  18. 计算机编程教育资源,风变编程以科技实现教育普惠,俱进教育公平
  19. C语言显示无法添加两个指针,【C语言】两个指针(地址)相减
  20. EDUCoder编程练习题解(结构体)

热门文章

  1. DevSecOps 现状:云 IT 的复杂度制造了“无法改变的”安全问题
  2. 使用递归方法 删除文件夹及文件夹内文件
  3. 利用位运算实现加减乘除
  4. iOS7 - NSURLSession
  5. exchange 2010 sp2系列之(二)证书配置
  6. 某化工学院安装锐捷elog
  7. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)
  8. PAT 1068. 万绿丛中一点红(20)-乙级
  9. 滨江学院 刘生 计算机网络考点知识点整理
  10. 1050. 螺旋矩阵(25)-PAT乙级真题