Google C++编码规范——2.命名规则

来源:互联网 发布:linux进去编辑模式 编辑:程序博客网 时间:2024/05/21 08:51

本文来源于:Google C++ Style Guide

引言:
在编码规范中,代码的命名规则最需要统一。比如你在一个项目组中,或者你的实验室一起开发一个项目,有统一的命名规则能使代码有很好的可读性,方便团队协作。

命名规则

最重要的一致性规则是命名规则,从命名风格可以直接看出其表示的是什么:类,变量,函数,常量,宏等。而不需要查找其声明,大脑中的模式匹配引擎非常依赖于这些命名规则。
命名可以很随意,但是一致性比个人喜好更重要。所以不管你是否觉得合理,规则毕竟是规则。

一般命名规则

命名应该具有描述性,避免缩写

  尽可能给出具有描述性的名称,并说明原因。不要担心会占用空间,因为更重要的是编码的可读性。不要用使一个项目外的人看不懂的缩写,也不要删除单词中的字母来缩写。
  规范的命名:

int price_count_reader;    // 没有缩写int num_errors;            // "num" 是通俗的用法int num_dns_connections;   // 大多数人都知道 "DNS" 是什么

  不规范的命名:

int n;                     // 没有意义int nerr;                  // 含糊的缩写int n_comp_conns;          // 含糊的缩写int wgc_connections;       // 只有项目组成员指导是什么意思int pc_reader;             // 很多缩写都可以是"pc"int cstmr_id;              // 删除了一些字母

注意,某些通用的缩写可以用,比如i作为迭代变量,T作为模板参数。
模板参数应该遵循其属性的命名规则:类型模板参数应该遵循类型命名规则,非类型模板参数应该遵循变量命名规则。

文件命名

文件名要全部小写,可以包含下划线(_)或短线(-),按项目约定来。如果没有约定,一般倾向用(_)。

规范的命名:

  • my_useful_class.cc
  • my-useful-class.cc
  • myusefulclass.cc
  • myusefulclass_test.cc // _unittest and _regtest are deprecated.
      C++源文件应该以.cc结尾,头文件应该以.h结尾。非头文件但是被包含的应该以.inc结尾。
      不要使用在/usr/include中已经存在的文件,如db.h。(linux or unix系统)
      一般来说,文件名应很具体。 例如,使用http_server_logs.h而不是logs.h。 用例如foo_bar.h和foo_bar.cc的文件,定义一个名为FooBar的类。
      内联函数必须在.h文件中。 如果你的内联函数很短,他们应该直接进入你的.h文件。(如果很长,使用另外的-inl.h)

类型命名

类型名应该以大写字母开头,每个单词开头都须用大写字母,且不带下划线。如:MyExcitingClass, MyExcitingEnum.
所有类型的命名(类,结构,类型别名,枚举和类型模板参数)具有相同的命名约定。 例如:

// classes and structsclass UrlTable { ...class UrlTableTester { ...struct UrlTableProperties { ...// typedefstypedef hash_map<UrlTableProperties *, string> PropertiesMap;// using aliasesusing PropertiesMap = hash_map<UrlTableProperties *, string>;// enumsenum UrlTableErrors { ...

变量命名

变量(包括函数参数)和数据成员的名称都是小写字母,字之间带下划线。 类(不是结构体)的数据成员还应有尾下划线。 例如:a_local_variable,a_struct_data_member,a_class_data_member_。

普通变量名:
  规法写法:

string table_name;  // OK - uses underscore.string tablename;   // OK - all lowercase.

  不规范写法:

string tableName;   // Bad - mixed case.

类成员变量

类的数据成员,无论静态和非静态,像普通非成员变量那样命名,但带有尾下划线。

class TableInfo {  ... private:  string table_name_;  // OK - underscore at end.  string tablename_;   // OK.  static Pool<TableInfo>* pool_;  // OK.};

* 结构体数据成员*

结构体的数据成员(无论静态和非静态)都像普通非成员变量一样命名。 它们没有类中的数据成员的尾下划线。

常量命名

变量声明为constexpr或const,并且其值在程序的持续时间内是固定的,以前导“k”后跟混合大小写命名。例如:

const int kDaysInAWeek = 7;

  所有这些具有静态存储持续时间的变量(即静态和全局变量)应该这样命名。对于其他存储类的变量,这个规则是可选的。例如auto类型变量。除此之外,通常的变量命名都使用这个规则。】

函数命名

普通函数命名有固定格式,存取函数需要与变量对应。

  通常,函数应以大写字母开头,并为每个新单词(例如“Camel Case”或“Pascal case”)使用大写字母。且没有下划线。 一般将大写首字母缩写词作为单个字(即StartRpc(),而不是StartRPC())。

AddTableEntry()DeleteUrl()OpenFileOrDie()

  存取函数应与相应变量对应。一般对应类成员变量。但并不是必须的,例如int count() 和 void set_count(int count).

命名空间的命名

命名空间名称都是小写。顶级命名空间名称基于项目名称。避免嵌套命名空间和有名的顶级命名空间之间的冲突。

  顶级命名空间的名称通常应为包含在该命名空间中的项目或团队的名称。该命名空间中的代码所在的目录(或其子目录)名应与命名空间名称匹配。
  像变量名一样,缩写名称的规则适用于命名空间。命名空间中的代码很少需要提及命名空间名称,因此通常不需要缩写。
  避免嵌套命名空间和有名的顶级命名空间冲突。由于名称查找规则,命名空间名称之间的冲突可能导致意外的构建中断。特别是,不要创建任何嵌套的std命名空间。在名称冲突(websearch :: index,websearch :: index_util)时,首选唯一的项目标识符(例如websearch :: util)。
  对于内部命名空间,应注意其他代码(团队中的内部成员)添加到同一内部命名空间中可能导致冲突。在这种情况下,使用文件名来创建一个唯一的内部名称(websearch :: index :: frobber_internal用于frobber.h)。

枚举命名

枚举(对于scoped和非scoped枚举)应像常量或宏那样命名:kEnumName或ENUM_NAME。

  枚举类型优先像常数那样命名。 但是,也可以像宏那样命名。 枚举名称UrlTableErrors(和AlternateUrlTableErrors)是一种类型,因此混合大小写。

enum UrlTableErrors {  kOK = 0,  kErrorOutOfMemory,  kErrorMalformedInput,};enum AlternateUrlTableErrors {  OK = 0,  OUT_OF_MEMORY = 1,  MALFORMED_INPUT = 2,};

宏命名

一般并不倾向使用宏,对吧?如果要用,像这样: MY_MACRO_THAT_SCARES_SMALL_CHILDREN

一般不应该使用宏。 但是,如果必要,那么它们应该全用大写和下划线命名。

#define ROUND(x) ...#define PI_ROUNDED 3.0

命名规则的例外

  如果要命名的对象与现有的C或C ++实体相似时,那么你可以遵循现有的命名约定方案。
bigopen()
  function name, follows form of open()
uint
  typedef
bigpos
  struct or class, follows form of pos
sparse_hash_map
  STL-like entity; follows STL naming conventions
LONGLONG_MAX
  a constant, as in INT_MAX

2 0
原创粉丝点击