Files
wiki/Qt码规范.md

268 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 开发团队C++编码规范
- [开发团队C++编码规范](#开发团队c编码规范)
- [代码风格](#代码风格)
- [缩进](#缩进)
- [变量声明](#变量声明)
- [空白](#空白)
- [大括号](#大括号)
- [圆括号](#圆括号)
- [Switch 语句](#switch-语句)
- [断行](#断行)
- [继承与关键字 `virtual`](#继承与关键字-virtual)
- [通用例外](#通用例外)
- [附录A 参考列表](#附录a-参考列表)
## 代码风格
### 缩进
- 采用4个空格
- 空格不要用TAB
### 变量声明
- 每行一个变量
- 尽可能避免短的变量名(比如"a", "rbarr", "nughdeget")
- 单字符的变量只在临时变量或循环的计数中使用
- 等到真正需要使用时再定义变量
```cpp
// 错误示例
int a, b;
char *c, *d;
// 正确
int height;
int width;
char *nameOfThis;
char *nameOfThat;
```
- 以小写字符开头,后续单词以大写开头
- 避免使用缩写
```cpp
// 错误示例
short Cntr;
char ITEM_DELIM = '';
// 正确
short counter;
char itemDelimiter = '';
```
- 类名总是以大写开头。公有类以Q开头(QRgb)公有函数通常以q开头(qRgb)。
### 空白
- 利用空行将语句恰当地分组
- 总是使用一个空行(不要空多行)
- 总是在每个关键字和大括号前使用一个空格
```cpp
// 错误示例
if(foo){
}
// 正确
if (foo) {
}
```
- 对指针和引用,在类型和*&之间加一个空格,但在*&与变量之间不加空格
```cpp
char *x;
const QString &myString;
const char* const y = "hello";
```
- 二元操作符前后加空白
- 类型转换后不加空白
- 尽量避免C风格的类型转换
```cpp
// 错误示例
char* blockOfMemory = (char* ) malloc(data.size());
// 正确
char *blockOfMemory = reinterpret_cast<char*>(malloc(data.size()));
```
### 大括号
- 基本原则:左大括号和语句保持在同一行:
```cpp
// 错误示例
if (codec)
{
}
// 正确
if (codec) {
}
```
- 例外:函数定义和类定义中,左大括号总是单独占一行:
```cpp
static void foo(int g)
{
qDebug("foo: %i", g);
}
class Moo
{
};
```
- 控制语句的body中只有一行时不使用大括号
```cpp
// 错误示例
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如果父语句跨多行则使用大括号
```cpp
// 正确
if (address.isEmpty() || !isValid()
|| !codec) {
return false;
}
```
- 例外2在if-else结构中有一处跨多行则使用大括号
```cpp
// 错误示例
if (address.isEmpty())
return false;
else {
qDebug("%s", qPrintable(address));
it;
}
// 正确
if (address.isEmpty()) {
return false;
} else {
qDebug("%s", qPrintable(address));
it;
}
// 错误示例
if (a)
if (b)
else
// 正确
if (a) {
if (b)
else
}
```
- 如果控制语句的body为空则使用大括号
```cpp
// 错误示例
while (a);
// 正确
while (a) {}
```
### 圆括号
- 使用圆括号将表达式分组
```cpp
// 错误示例
if (a && b || c)
// 正确
if ((a && b) || c)
// 错误示例
a | b & c
// 正确
(a + b) & c
```
### Switch 语句
- case 和 switch 位于同一列
- 每一个case必须有一个break(或renturn)语句或者用注释说明无需break
```cpp
switch (myEnum) {
case Value1:
doSomething();
break;
case Value2:
doSomethingElse();
// fall through
default:
defaultHandling();
break;
}
```
### 断行
- 保持每行短于100 个字符,需要时进行断行
- 逗号放一行的结束,操作符放到一行的开头。如果你的编辑器太窄,一个放在行尾的操作符不容易被看到。
```cpp
// 正确
if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) {
}
// Wrong
if (longExpression +
otherLongExpression +
otherOtherLongExpression) {
}
```
### 继承与关键字 `virtual`
- 重新实现一个虚函数时,头文件中 不 放置 virtual 关键字。
### 通用例外
如果它使你的代码看起来不好,你可以打破任何一个规则 。
## 附录A 参考列表
1. [Qt编码风格/Qt Coding Style](https://wiki.qt.io/Qt_Coding_Style)
2. [LLVM编码标准/LLVM Coding Standards](https://llvm.org/docs/CodingStandards.html)
3. [谷歌C++风格指南/Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)
4. [C++核心指南/Cpp Core Guidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)