google风格c/c++编程规范---命名约定(代码片段)

Overboom Overboom     2023-03-07     238

关键词:

命名的风格能让我们在不需要去查找类型声明的条件下快速地了解某个名字代表的含义: 类型, 变量, 函数, 常量, 宏, 等等, 甚至. 我们大脑中的模式匹配引擎非常依赖这些命名规则.

7.1 通用命名规则

总述
函数命名, 变量命名, 文件命名要有描述性; 少用缩写.

说明
尽可能使用描述性的命名, 别心疼空间, 毕竟相比之下让代码易于新读者理解更重要. 不要用只有项目开发者能理解的缩写, 也不要通过砍掉几个字母来缩写单词.

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;              // 删减了若干字母.

注意

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

7.2. 文件命名

说明
文件名要全部小写, 可以包含下划线 () 或连字符 (-), 依照项目的约定. 如果没有约定, 那么 “” 更好.

说明
可接受的文件命名示例:

    my_useful_class.cc
    my-useful-class.cc
    myusefulclass.cc
    myusefulclass_test.cc // _unittest 和 _regtest 已弃用.

C++ 文件要以 .cc 结尾, 头文件以 .h 结尾. 专门插入文本的文件则以 .inc 结尾, 参见 头文件自足.

不要使用已经存在于 /usr/include 下的文件名 (注: 即编译器搜索系统头文件的路径), 如 db.h.

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

内联函数必须放在 .h 文件中. 如果内联函数比较短, 就直接放在 .h 中.

7.3. 类型命名

总述
类型名称的每个单词首字母均大写, 不包含下划线: MyExcitingClass, MyExcitingEnum.

说明
所有类型命名 —— 类, 结构体, 类型定义 (typedef), 枚举, 类型模板参数 均使用相同约定, 即以大写字母开始, 每个单词首字母均大写, 不包含下划线. 例如:

// 类和结构体
class UrlTable  ...
class UrlTableTester  ...
struct UrlTableProperties  ...

// 类型定义
typedef hash_map<UrlTableProperties *, string> PropertiesMap;

// using 别名
using PropertiesMap = hash_map<UrlTableProperties *, string>;

// 枚举
enum UrlTableErrors  ...

7.4. 变量命名

总述
变量 (包括函数参数) 和数据成员名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体内部的变量的就不用。

说明

  1. 普通变量命名
    举例:
string table_name;  // 好 - 用下划线.
string tablename;   // 好 - 全小写.

string tableName;  // 差 - 混合大小写
  1. 类数据成员
    不管是静态的还是非静态的, 类数据成员都可以和普通变量一样, 但要接下划线.
class TableInfo 
  ...
 private:
  string table_name_;  // 好 - 后加下划线.
  string tablename_;   // 好.
  static Pool<TableInfo>* pool_;  // 好.
;
  1. 结构体变量
    不管是静态的还是非静态的, 结构体数据成员都可以和普通变量一样, 不用像类那样接下划线:
struct UrlTableProperties 
  string name;
  int num_entries;
  static Pool<UrlTableProperties>* pool;
;

结构体与类的使用讨论, 参考 结构体 vs. 类.

7.5. 常量命名

总述
声明为 constexpr 或 const 的变量, 或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合. 例如:

const int kDaysInAWeek = 7;

说明
所有具有静态存储类型的变量 (例如静态变量或全局变量, 参见 存储类型) 都应当以此方式命名. 对于其他存储类型的变量, 如自动变量等, 这条规则是可选的. 如果不采用这条规则, 就按照一般的变量命名规则.

7.6. 函数命名

总述
常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配: MyExcitingFunction(), MyExcitingMethod(), my_exciting_member_variable(), set_my_exciting_member_variable().

说明
一般来说, 函数名的每个单词首字母大写 (即 “驼峰变量名” 或 “帕斯卡变量名”), 没有下划线. 对于首字母缩写的单词, 更倾向于将它们视作一个单词进行首字母大写 (例如, 写作 StartRpc() 而非 StartRPC()).

AddTableEntry()
DeleteUrl()
OpenFileOrDie()

(同样的命名规则同时适用于类作用域与命名空间作用域的常量, 因为它们是作为 API 的一部分暴露对外的, 因此应当让它们看起来像是一个函数, 因为在这时, 它们实际上是一个对象而非函数的这一事实对外不过是一个无关紧要的实现细节.)

取值和设值函数的命名与变量一致. 一般来说它们的名称与实际的成员变量对应, 但并不强制要求. 例如 int count() 与 void set_count(int count).

7.7. 命名空间命名

总述
命名空间以小写字母命名. 最高级命名空间的名字取决于项目名称. 要注意避免嵌套命名空间的名字之间和常见的顶级命名空间的名字之间发生冲突.

顶级命名空间的名称应当是项目名或者是该命名空间中的代码所属的团队的名字. 命名空间中的代码, 应当存放于和命名空间的名字匹配的文件夹或其子文件夹中.

注意 不使用缩写作为名称 的规则同样适用于命名空间. 命名空间中的代码极少需要涉及命名空间的名称, 因此没有必要在命名空间中使用缩写.

要避免嵌套的命名空间与常见的顶级命名空间发生名称冲突. 由于名称查找规则的存在, 命名空间之间的冲突完全有可能导致编译失败. 尤其是, 不要创建嵌套的 std 命名空间. 建议使用更独特的项目标识符 (websearch::index, websearch::index_util) 而非常见的极易发生冲突的名称 (比如 websearch::util).

对于 internal 命名空间, 要当心加入到同一 internal 命名空间的代码之间发生冲突 (由于内部维护人员通常来自同一团队, 因此常有可能导致冲突). 在这种情况下, 请使用文件名以使得内部名称独一无二 (例如对于 frobber.h, 使用 websearch::index::frobber_internal).

7.8. 枚举命名

总述
枚举的命名应当和 常量 或 宏 一致: kEnumName 或是 ENUM_NAME.
说明
单独的枚举值应该优先采用 常量 的命名方式. 但 宏 方式的命名也可以接受. 枚举名 UrlTableErrors (以及 AlternateUrlTableErrors) 是类型, 所以要用大小写混合的方式.

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

2009 年 1 月之前, 我们一直建议采用 宏 的方式命名枚举值. 由于枚举值和宏之间的命名冲突, 直接导致了很多问题. 由此, 这里改为优先选择常量风格的命名方式. 新代码应该尽可能优先使用常量风格. 但是老代码没必要切换到常量风格, 除非宏风格确实会产生编译期问题.

7.9. 宏命名

总述
你并不打算 使用宏, 对吧? 如果你一定要用, 像这样命名:

MY_MACRO_THAT_SCARES_SMALL_CHILDREN.

说明
参考 预处理宏; 通常 不应该 使用宏. 如果不得不用, 其命名像枚举命名一样全部大写, 使用下划线:

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

7.10. 命名规则的特例

总述
如果你命名的实体与已有 C/C++ 实体相似, 可参考现有命名策略.

bigopen(): 函数名, 参照 open() 的形式

uint: typedef

bigpos: struct 或 class, 参照 pos 的形式

sparse_hash_map: STL 型实体; 参照 STL 命名约定

LONGLONG_MAX: 常量, 如同 INT_MAX

命名规范

...可能还没什么感觉,但是当代码量达到上千上万时,命名风格统一的优势就能明显感受出来,阅读起来会产生一股浓浓的亲切感。因此在这里记录部分google开源项目风格指南中的命名约定,权当参考。变量变量名尽量体现出它的... 查看详情

google编码风格之命名规范(备忘)(代码片段)

参考链接:http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming/通用规则:所有函数、变量、类与文件命名尽量不要使用缩写,以方便理解。除了不容易引起歧义的,如DNS等。特殊规则:1)类的... 查看详情

google编码风格之命名规范(备忘)(代码片段)

参考链接:http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming/通用规则:所有函数、变量、类与文件命名尽量不要使用缩写,以方便理解。除了不容易引起歧义的,如DNS等。特殊规则:1)类的... 查看详情

来自google的r语言编码风格指南

...主要用于统计计算和绘图的高级编程语言.这份R语言编码风格指南旨在让我们的R代码更容易阅读、分享和检查.以下规则系与Google的R用户群体协同设计而成. 概要:R编码风格约定文件命名:以 .R (大写)结尾标识符命名:&nbs... 查看详情

googlejava编程风格指南

前言这份文档是GoogleJava编程风格规范的完整定义。当且仅当一个Java源文件符合此文档中的规则,我们才认为它符合Google的Java编程风格。与其它的编程风格指南一样,这里所讨论的不仅仅是编码格式美不美观的问题,同时也讨论... 查看详情

编程基本的命名规范(记录一下)

1、命名规则约定:2.匈牙利命名法:变量名=属性+类型+对象描述2.1属性命名规则2.2关键字母组合  查看详情

python编程规范指南详解上(代码片段)

...规范详解指南上一、Python主流编程规范参考指南(一)、PEP8风格指南(二)、Google开源项目风格指南二、与空白和换行有关的建议三、与命名有关的建议四、与表达式和语句有关的建议五、与引入有关的建议Python中关于编程规范的小... 查看详情

结对编程

...631062302码云地址:https://gitee.com/SC_looker/wc.exe15.git制定c/c++编程规范命名约定类(结构)名类名必须是名词,类名必须明确表示这个类代表了什么。如果类名超过3个单词,说明这个类有可能需要拆分了。不要把父类的名字带到子... 查看详情

承诺的 JavaScript 命名约定? [关闭]

...常不喜欢或提倡编程语言标准之外的命名约定,但在编程风格中,promise作为函数参数传递,通常很难一眼看出变量是否持有promise或“真实的 查看详情

让你最快速地改善代码质量的20条编程规范(代码片段)

...个部分:命名与注释(NamingandComments)、代码风格(CodeStyle)和编程技巧(CodingTips)。关于命名命名的关键是能准确达意 查看详情

让你最快速地改善代码质量的20条编程规范(代码片段)

...个部分:命名与注释(NamingandComments)、代码风格(CodeStyle)和编程技巧(CodingTips)。关于命名命名的关键是能准确达意 查看详情

编程规范

  GoogleC++StyleGuide一张图总结(源自网络)Google开源项目风格指南 包含 C++pythonshellJSONobjective-c的编程规范 java编程规范:阿里巴巴Java开发手册  查看详情

mysql基本约定与命名规范

一、约定   1、如无特殊需求,所有表使用innodb引擎   2、如无特殊需求,所有主键均为自增类型   3、如无特殊需求,所有字段均为NOTNULL,并给定默认值   4、所有字段均设置备注,枚... 查看详情

大厂通用的mysql开发规范设计,包括“存储引擎字符集命名规则等公共约定”,“表设计约定”,“字段设计约定”,“索引设计约定”,“sql约定”,“开发人员行为约定”

...”怎样才更优秀?“索引设计约定”该如何设计?有没有规范的“SQL约定”?对于开发人员,有哪些“开发人员行为约定”,需要遵守?下文,既是综合BAT大厂的MySQL开发规范设计,包括“存储引擎、字符集、命名规则等公共约 查看详情

规范alibaba编码规范阅读

...式,更不允许直接使用中文的方式3、类名使用UpperCamelCase风格,必须遵从驼峰形式,但是:DOBODTOVOAO除外4、方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰格式5、常量名全部大写,单词间用下划... 查看详情

什么是规范的 YAML 命名风格

】什么是规范的YAML命名风格【英文标题】:WhatisthecanonicalYAMLnamingstyle【发布时间】:2014-05-1108:41:00【问题描述】:我正在设计一个新的YAML文件,我想使用最标准的命名风格。是哪个?连字符?-job-name:...lower_case_with_underscores?-job_... 查看详情

.net设计规范————命名规范

NET设计规范:约定、惯用法与模式———命名规范前言:     最近在看《.NET设计规范:约定、惯用法与模式》一书,主要还是讲.NET的设计规范,以前对这一块也不是特别在意,最近想要把这些系统的学... 查看详情

分析一套源代码的代码规范和风格并讨论如何改进优化代码

分析一套源代码的代码规范和风格并讨论如何改进优化代码1、结合工程实践选题相关的一套源代码,根据其编程语言或项目特点,分析其在源代码目录结构、文件名/类名/函数名/变量名等命名、接口定义规范和单元测试组织形... 查看详情