简 述: Qt_Coding_Style
;Qt
官方编码风格;
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
同步博文:
- 本篇的csdn/github.io同步博文: Qt官方编码Style
缩进:
- 4个空格用于缩进
- 空格,而不是制表符!
声明变量:
- 在单独的行中声明每个变量
- 避免使用简短或无意义的名称(例如“ a”,“ rbarr”,“ nughdeget”)
- 单字符变量名称仅适用于计数器和临时变量,其中变量的用途显而易见
- 在声明变量之前等待,直到需要它为止
// Wrong
int a, b;
char *c, *d;
// Correct
int height;
int width;
char *nameOfThis;
char *nameOfThat;
- 变量和函数以小写字母开头。变量名称中的每个连续单词均以大写字母开头
避免缩写
// Wrong
short Cntr;
char ITEM_DELIM = ' ';
// Correct
short counter;
char itemDelimiter = ' ';
- 类始终以大写字母开头。
Public classes
以“ Q”(QRgb)开头,后跟一个大写字母。Public functions
通常以“ q”(qRgb)开头。
首字母缩写使用驼峰式(例如QXmlStreamReader,而不是QXMLStreamReader)。
空格:
- 使用空行将语句组合在一起
- 始终只使用一个空白行
- 始终在关键字之后和花括号前使用一个空格:
// Wrong
if(foo){
}
// Correct
if (foo) {
}
- 对于指针或引用,请始终在类型和’‘或’&’之间使用单个空格,但在’‘或’&’与变量名称之间请勿使用空格:
char *x;
const QString &myString;
const char * const y = "hello";
- 带空格的二进制运算符
- 在每个逗号后留一个空格
- 投放后没有空间
- 尽可能避免使用C型转换
// Wrong
char* blockOfMemory = (char* ) malloc(data.size());
// Correct
char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
- 不要在一行上放置多个语句
- 通过扩展,对控制流语句的主体使用新行:
// Wrong
if (foo) bar();
// Correct
if (foo)
bar();
大括号:
- 使用附带的括号:开头的括号与语句的开头在同一行。如果右括号后面紧跟着另一个关键字,则它也会进入同一行:
// Wrong
if (codec)
{
}
else
{
}
// Correct
if (codec) {
} else {
}
- 例外:函数实现(但不包括lambdas)和类声明始终在行首处使用左括号:
static void foo(int g)
{
qDebug("foo: %i", g);
}
class Moo
{
};
- 仅当条件语句的主体包含多行时才使用花括号:
// Wrong
if (address.isEmpty()) {
return false;
}
for (int i = 0; i < 10; ++i) {
qDebug("%i", i);
}
// Correct
if (address.isEmpty())
return false;
for (int i = 0; i < 10; ++i)
qDebug("%i", i);
- 例外1:如果父语句包含多行/自动换行,也请使用花括号:
// Correct
if (address.isEmpty() || !isValid()
|| !codec) {
return false;
}
- 例外2:花括号对称:在if-then-else块中,如果if代码或else代码覆盖几行,也要使用花括号:
// Wrong
if (address.isEmpty())
qDebug("empty!");
else {
qDebug("%s", qPrintable(address));
it;
}
// Correct
if (address.isEmpty()) {
qDebug("empty!");
} else {
qDebug("%s", qPrintable(address));
it;
}
// Wrong
if (a)
…
else
if (b)
…
// Correct
if (a) {
…
} else {
if (b)
…
}
- 条件语句的主体为空时使用花括号
// Wrong
while (a);
// Correct
while (a) {}
括号:
- 使用括号将表达式分组:
// Wrong
if (a && b || c)
// Correct
if ((a && b) || c)
// Wrong
a + b & c
// Correct
(a + b) & c
切换语句:
case
标签与开关在同一列中- 每个
case
的末尾都必须有一个break
(或return
)语句,或者Q_FALLTHROUGH()用来表明没有故意的中断,除非立即发生另一case
。
switch (myEnum) {
case Value1:
doSomething();
break;
case Value2:
case Value3:
doSomethingElse();
Q_FALLTHROUGH();
default:
defaultHandling();
break;
}
跳转语句(中断,继续,返回和跳转):
- 不要在跳转语句后加上“ else”:
// Wrong
if (thisOrThat)
return;
else
somethingElse();
// Correct
if (thisOrThat)
return;
somethingElse();
- 例外:如果代码本质上是对称的,则允许使用“ else”来可视化该对称性
换行:
- 保持少于100个字符的行;必要时包裹
- 注释/ apidoc行应保留在实际文本的80列以下。适应周围的环境,并尝试以避免出现“锯齿状”段落的方式使文本流畅。
- 逗号放在换行符的末尾;运算符从新行的开头开始。如果编辑器太窄,则很容易错过该行末尾的运算符。
// Wrong
if (longExpression +
otherLongExpression +
otherOtherLongExpression) {
}
// Correct
if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) {
}
一般例外:
- 当严格遵循规则会使您的代码看起来很糟糕时,请随意破坏它。
- 如果在任何给定的模块中存在争议,则维护者对接受的样式拥有最终决定权(根据Qt管治模型)。
艺术风格:
- 以下代码片段可以按艺术风格用于重新格式化代码。
--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
- 注意“ unlimited” –max-instatement-indent仅用于因为如果后续行需要缩进限制,那么astyle不够聪明,无法包装第一个参数。建议您手动将语句内缩进限制为大约50个列:
int foo = some_really_long_function_name(and_another_one_to_drive_the_point_home(
first_argument, second_argument, third_arugment));