赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。