Qt官方代码风格,可以参考一下。
缩进
- 使用4个空格;
- 注意:使用空格而不是制表符(Tab按键)。
声明变量
- 在单独的行上声明每个变量;
- 避免使用简短或无意义的名称(例如”a”,”rbarr”,”nughdeget”);
- 单个字符变量名称仅适用于计数器和临时变量,其中变量的目的是为了显而易见;
不恰当用法:1
2int a, b;
char *c, *d;
纠正:1
2
3
4int height;
int width;
char *nameOfThis;
char *nameOfThat;
- 变量和函数以小写字母开头。变量名称中的每个连续单词都以大写字母开头;
- 避免使用缩写;
不恰当用法:1
2short Cntr; // 不明确的缩写
char ITEM_DELIM = ' ';
纠正:1
2short counter;
char itemDelimiter = ' ';
类始终以大写字母开头。如公共类以’Q’(QRgb)开头,后跟大写字母。公共函数通常以’q’(qRgb)开头;
首字母缩略词是驼峰式(例如QXmlStreamReader,而不是QXMLStreamReader)。
空白符
- 使用空行将语句组合在一起;
- 始终只使用一个空白行;
- 始终在关键字之后和大括号之前使用单个空格;
不恰当用法:1
2if(foo){
}
纠正:1
2if (foo) {
}
- 对于指针或引用,始终在类型和
*
或&
之间使用单个空格,但在*
或&
与变量名称之间没有空格;1
2
3char *x;
const QString &myString;
const char * const y = "hello";
- 用空格包围二进制运算符;
- 每个逗号后留一个空格;
- 转换模式的使用后没有空格;
- 尽可能避免使用C风格的转换;
不恰当用法:1
char* blockOfMemory = (char* ) malloc(data.size());
纠正:1
char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
- 不要在同一行上放置多个语句;
- 控制流语句的主体上使用一个新行;
不恰当用法:1
if (foo) bar();
纠正:1
2if (foo)
bar();
花括号
- 使用附加花括号的情况:左花括号与语句的开头位于同一行。如果右花括号后跟另一个关键字,它也会进入同一行;
不恰当用法:1
2
3
4
5
6if (codec)
{
}
else
{
}
纠正:1
2
3if (codec) {
} else {
}
- 例外情况:函数实现(但不是lambda)和类声明总是在行的开头有左括号;
1
2
3
4
5
6
7
8static void foo(int g)
{
qDebug("foo: %i", g);
}
class Moo
{
};
- 仅当条件语句的主体包含多行时才使用花括号:
不恰当用法:1
2
3
4
5
6
7if (address.isEmpty()) {
return false;
}
for (int i = 0; i < 10; ++i) {
qDebug("%i", i);
}
纠正:1
2
3
4
5if (address.isEmpty())
return false;
for (int i = 0; i < 10; ++i)
qDebug("%i", i);
例外1:如果父条件语句包含多行或换行,也可以使用花括号:
1
2
3
4if (address.isEmpty() || !isValid()
|| !codec) {
return false;
}例外2:支持对称:在if-then-else块中也使用花括号,其中if-code或else-code包含多行:
不恰当用法:1
2
3
4
5
6if (address.isEmpty())
qDebug("empty!"); // 这里不对称,容易造成误解
else {
qDebug("%s", qPrintable(address));
it;
}
纠正:1
2
3
4
5
6if (address.isEmpty()) {
qDebug("empty!");
} else {
qDebug("%s", qPrintable(address));
it;
}
不恰当用法:1
2
3
4
5
6// 多级嵌套语句没花括号容易逻辑错误
if (a)
…
else
if (b)
…
纠正:1
2
3
4
5
6if (a) {
…
} else {
if (b)
…
}
- 当条件语句的主体为空时使用花括号
不恰当用法:1
while (a);
纠正:1
while (a) {}
括号
- 使用括号对表达式进行分组:
不恰当用法:1
if (a && b || c)
纠正:1
if ((a && b) || c)
不恰当用法:1
a + b & c
纠正:1
(a + b) & c
switch语句
- case与switch位于同一列;
- 每个case必须在结尾处有一个break(或return)声明,例外:
- 用于Q_FALLTHROUGH()表示故意不中断;
- case后立刻进入下一个case。
1
2
3
4
5
6
7
8
9
10
11
12switch (myEnum) {
case Value1:
doSomething();
break;
case Value2: // case后立刻进入下一个case
case Value3:
doSomethingElse();
Q_FALLTHROUGH();
default:
defaultHandling();
break;
}
跳转语句(break, continue, return, and goto)
跳转语句后不要放’else’。
不恰当做法:
1
2
3
4if (thisOrThat)
return;
else
somethingElse();
纠正:1
2
3if (thisOrThat)
return;
somethingElse();
- 例外:如果代码本质上是对称的,则允许使用’else’来显示对称性。
换行
- 保持一行短于100个字符并在必要时换行。
- 注释/函数说明行应保持在80列实际文本之下。调整周围的文本布局,并尝试以避免“锯齿状”段落的方式流动文本。
- 在换行后的末尾加上逗号;
- 操作符从新行开始。如果编辑器太窄,则很容易忽略行尾的操作符。
不恰当用法:1
2
3
4if (longExpression +
otherLongExpression +
otherOtherLongExpression) {
}
纠正:1
2
3
4if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) {
}
一般例外
- 如果严格遵循规则会使您的代码看起来很糟糕,请随意打破它。
- 如果任何给定模块中存在争议,则维护者对可接受的样式有最终决定权。