缩进
- 使用4个空格进行缩进
- 使用空格,不要使用Tab来缩进
变量声明
- 每个变量声明使用单独一行
- 避免使用过于简化或没有意义的名称(如,"a", "rbarr", "nughdeget")
- 单字符的变量名仅仅在含义非常明显的场景可以使用,如计数或临时字符
// 错误
int a, b;
char *c, *d;
// 正确
int height;
int width;
char *nameOfThis;
char *nameOfThat;
- 只要在需要时才声明变量
- 变量名和方法明使用小写字母开头,后面连续的单词首字母大写。
- 不要使用缩略
// 错误
short Cntr;
char ITEM_DELIM = ' ';
// 正确
short counter;
char itemDelimiter = ' ';
- 类名称永远使用大写字母开头。公开类以'Q'开头,后接大写字母(QRgb)。公共方法通常以'q'开头(qRgb)。
- 缩略词在开头的也是用驼峰样式(如,QXmlStreamReader, 而不是 QXMLStreamReader)。
空格
- 使用空行将语句组合在适合的地方
- 始终只使用一个空白行
- 始终在关键字之后和大括号之前添加一个空格:
// 错误
if(foo){
}
// 正确
if (foo) {
}
- 对于指针或引用,始终在类型和“”或“&”之间使用单个空格,但在“”或“&”与变量名称之间不要有空格。
char *x;
const QString &myString;
const char * const y = "hello";
- 在二元运算符前后添加空格
- 在类型转换关键词后不要添加空格
- 尽量避免使用C风格的类型转换
// 错误
char* blockOfMemory = (char* ) malloc(data.size());
// 正确
char *blockOfMemory = reinterpret_cast(malloc(data.size()));
- 不要把多个语句放在一行上
- 通过扩展,对控制流程语句的主体使用一个新行:(原句:By extension, use a new line for the body of a control flow statement:)
// 错误
if (foo) bar();
// 正确
if (foo)
bar();
大括号
- 使用紧连的大括号:大括号与声明的开头位于同一行。 如果右大括号后跟另一个关键字,也要放在一行中:
// 错误
if (codec)
{
}
else
{
}
// 正确
if (codec) {
} else {
}
- 例外:函数实现(但不是lambda表达式)和类声明始终在新行行首添加左括号:
static void foo(int g)
{
qDebug("foo: %i", g);
}
class Moo
{
};
- 仅当条件语句的主体包含多行时才使用花括号:
// 错误
if (address.isEmpty()) {
return false;
}
for (int i = 0; i < 10; ++i) {
qDebug("%i", i);
}
// 正确
if (address.isEmpty())
return false;
for (int i = 0; i < 10; ++i)
qDebug("%i", i);
- 例外1:如果父语句包含多行/换行符,也使用大括号:
// 正确
if (address.isEmpty() || !isValid()
|| !codec) {
return false;
}
- 例外2:括号对称性:在if-then-else块中使用大括号,不管if的主体或else的主体有几行:
// 错误
if (address.isEmpty())
qDebug("empty!");
else {
qDebug("%s", qPrintable(address));
it;
}
// 正确
if (address.isEmpty()) {
qDebug("empty!");
} else {
qDebug("%s", qPrintable(address));
it;
}
// 错误
if (a)
…
else
if (b)
…
// 正确
if (a) {
…
} else {
if (b)
…
}
- 当条件语句的主体为空时,使用花括号
// 错误
while (a);
// 正确
while (a) {}
小括号
- 使用小括号将表达式分组:
// 错误
if (a && b || c)
// 正确
if ((a && b) || c)
// 错误
a + b & c
// 正确
(a + b) & c
switch语句
- case关键词与switch位于同一列
- 每个case最后都必须有一个break(或return)语句,或者使用Q_FALLTHROUGH()来表示有意不中断,除非要后面紧接另一个case的内容。
switch (myEnum) {
case Value1:
doSomething();
break;
case Value2:
case Value3:
doSomethingElse();
Q_FALLTHROUGH();
default:
defaultHandling();
break;
}
跳转语句 (break, continue, return, and goto)
- 不要将else放在在跳转语句的后面:
// 错误
if (thisOrThat)
return;
else
somethingElse();
// 正确
if (thisOrThat)
return;
somethingElse();
- 例外:如果代码本身是对称的,则允许使用else来显示对称性
换行
- 保持一行少于100个字符; 如有必要则折行
- 注释/ apidoc行应保持在实际文本的80列以下。 根据周围内容进行调整,避免“锯齿”段落的方式(原文:Comment/apidoc lines should be kept below 80 columns of actual text. Adjust to the surroundings, and try to flow the text in a way that avoids "jagged" paragraphs.)
- 逗号在被折断行的行尾,操作符在新行的行首。操作符在行尾很容易被隐藏起来,如果编辑器比较窄的话。
// 错误
if (longExpression +
otherLongExpression +
otherOtherLongExpression) {
}
// 正确
if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) {
}
一般例外
- 当严格遵守规则使你的代码看起来很糟糕的时候,不要遵守
风格艺术
可以使用下面的代码风格使得你的代码更有艺术性
--style=kr
--indent=spaces=4
--align-pointer=name
--align-reference=name
--convert-tabs
--attach-namespaces
--max-code-length=100
--max-instatement-indent=120
--pad-header
--pad-oper
请注意,“无限制”--max-instatement-indent仅用于astyle,因为如果后续行需要缩进限制,astyle不够智能以包装第一个参数。 鼓励您手动限制在语句缩进大约50个列:(原文:Note that "unlimited" --max-instatement-indent is used only because astyle is not smart enough to wrap the first argument if subsequent lines would need indentation limitation. You are encouraged to manually limit in-statement-indent to roughly 50 colums:)
int foo = some_really_long_function_name(and_another_one_to_drive_the_point_home(
first_argument, second_argument, third_arugment));
官方原文链接