Google 有关C语言的编码风格规范


Google 经常会发布一些开源项目,意味着会接受来自其他代码贡献者的代码。但是如果代码贡献者的编程风格与 Google 的不一致,会给代码阅读者和其他代码提交者造成不小的困扰。Google 因此发布了许多语言的编程风格指南, 如C ++样式指南,Objective-C样式指南,Java样式指南,Python样式指南,Shell样式指南,HTML / CSS样式指南,JavaScript样式指南……使所有提交代码的人都能获知 Google 的编程风格。

本文结合Google Objective-C风格指南中文版和Google C++风格指南中文版中摘选出部分同样适用于C语言的风格规范,便于C语言初学者掌握一定编程规范。

1.留白
只使用空格,且一次缩进两个空格

在代码中使用空格而不是制表符缩进。应该将编辑器设置成自动将制表符替换成空格。

2.行宽
尽量让代码保持在 80 列之内。

通过设置 Xcode > Preferences > Text Editing > Show page guide,来使越界更容易被发现。

3.块(闭包)
块中的代码应该缩进 4 个空格

取决于块的长度,下列都是合理的风格准则:

如果一行可以写完块,则没必要换行。
如果不得不换行,块内的代码须按 4 空格缩进,关括号应与块声明的第一个字符对齐。
如果块太长,比如超过 20 行,建议把它定义成一个局部变量,然后再使用该变量。
) {之间须有一个空格。
块内允许按两个空格缩进,但前提是和项目的其它代码保持一致的缩进风格。
4.命名
函数命名, 变量命名, 文件命名要有描述性; 少用缩写

4.1 变量命名
Google 的 C++ 风格指南中推荐使用下划线分隔的单词作为变量名:

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

1、 string table_name;  // 好 - 用下划线.
2、string tablename;   // 好 - 全小写.

3、string tableName;  // 差 - 混合大小写

而苹果的风格指南则使用驼峰命名法:

当变量名和函数名称是由二个或多个单字链接在一起,而构成的唯一识别字时,单字之间不以空格断开(例:camel case)或连接号(-,例:camel-case)、下划线(_,例:camel_case),而是以以下两种格式命名:

小驼峰式命名法(lower camel case):
第一个单字以小写字母开始;第二个单字的首字母大写,例如:firstName、lastName。

大驼峰式命名法(upper camel case):
每一个单字的首字母都采用大写字母,例如:FirstName、LastName、CamelCase,也被称为Pascal命名法。

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

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

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

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

1、AddTableEntry()
2、DeleteUrl()
3、OpenFileOrDie()

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

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

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

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

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

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

// 枚举
enum UrlTableErrors { ...

4.5枚举命名
枚举的命名应当和 常量 或 宏 一致: kEnumName 或是 ENUM_NAME

单独的枚举值应该优先采用 常量 的命名方式. 但 宏 方式的命名也可以接受. 枚举名 UrlTableErrors (以及 AlternateUrlTableErrors) 是类型, 所以要用大小写混合的方式.

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

5.函数
5.1函数声明与定义
返回类型和函数名在同一行, 参数也尽量放在同一行, 如果放不下就对形参分行, 分行方式与函数调用一致

函数看上去像这样:

ReturnType ClassName::FunctionName(Type par_name1, Type par_name2) {
  DoSomething();
  ...
}

如果同一行文本太多, 放不下所有参数:

ReturnType ClassName::ReallyLongFunctionName(Type par_name1, Type par_name2,
                                             Type par_name3) {
  DoSomething();
  ...
}

甚至连第一个参数都放不下:

ReturnType LongClassName::ReallyReallyReallyLongFunctionName(
    Type par_name1,  // 4 space indent
    Type par_name2,
    Type par_name3) {
  DoSomething();  // 2 space inden

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值