Qt 底层代码规范(Qt Coding Style 翻译)
本文翻译自 Qt Coding Style
本文是对 Qt 底层代码规范的概述。对于上层代码规范,参见 Coding Conventions。
本文的信息来自于 Qt 的源代码、论坛、电子邮件以及开发者之间的合作。
为避免在代码样式上耗费过多时间,Qt 项目正在寻找一种自动化代码排版的解决方案。
缩进
- 使用 4 个空格进行缩进
- 不要使用制表符 tab
声明变量
-
每一行只声明一个变量
-
避免使用过短或无意义的变量名(e.g. “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 = ' '; -
类名总是以大写字母开头。公共类的类名要加前缀 “Q”,随后每个单词首字母大写(如:QRgb)。公共函数则常常加前缀 “q”(如:qRgb)。
-
首字母缩略词遵循驼峰拼写法(e.g. 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 { } -
例外情况:函数实现(不包括 lambda 表达式)以及类声明的左大括号总是另起一行:
static void foo(int g) { qDebug("foo: %i", g); } class Moo { }; -
仅当条件语句的主体不止一行时才使用大括号:(PS:个人建议一律使用大括号)
// 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
switch 语句
-
case 应与 switch 保持在同一列
-
每个 case 语句块应以 break 或 return 语句结束,或者使用
Q_FALLTHROUGH来表示故意不中断,或者 case 后为空直接接下一个 case。switch (myEnum) { case Value1: doSomething(); break; case Value2: case Value3: doSomethingElse(); Q_FALLTHROUGH(); default: defaultHandling(); break; }
跳转语句(break,continue,return 和 goto)
-
不要在跳转语句后跟 “else”:
// Wrong if (thisOrThat) return; else somethingElse(); // Correct if (thisOrThat) return; somethingElse(); -
例外情况:若代码本身是对称的,则允许使用 “else” 来达到视觉上的对称
换行
-
每一行的长度应小于 100 个字符;必要时换行
-
注释或函数说明行的长度应在 80 列实际文本以下。调整周围文本,避免出现“锯齿状”的段落。
-
逗号出现在换行行的行尾,运算符出现在新行的行首。如果编辑空间太窄,则很容易忽略行尾的操作符。
// Wrong if (longExpression + otherLongExpression + otherOtherLongExpression) { } // Correct if (longExpression + otherLongExpression + otherOtherLongExpression) { }
一般例外情况
- 如果严格遵循规则使代码看起来很糟糕,则无须遵守。
- 如果任何方面存在争议,则维护者对样式有最终决定权。
Artistic Style 格式化工具
artistic style 可使用以下代码片段来格式化代码。
--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 不够智能,当后续行需要缩进缩进限制时,无法在第一个参数处换行。建议手动将语句内缩进(in-statement-indent)限制在约 50 列以内:
int foo =
some_really_long_function_name(and_another_one_to_drive_the_point_home(
first_argument, second_argument, third_arugment));
更多推荐


所有评论(0)