Files
wiki/编码规范.md
2024-07-15 15:31:24 +08:00

4.7 KiB
Raw Blame History

开发团队C++编码规范

代码风格

缩进

  • 采用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)。

空白

  • 利用空行将语句恰当地分组
  • 总是使用一个空行(不要空多行)
  • 总是在每个关键字和大括号前使用一个空格
   // 错误示例
   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<char'''>(malloc(data.size()));

大括号

  • 基本原则:左大括号和语句保持在同一行:
  // 错误示例
  if (codec)
  {
  }
  
   // 正确
  if (codec) {
  }
  • 例外:函数定义和类定义中,左大括号总是单独占一行:
  static void foo(int g)
  {
      qDebug("foo: %i", g);
  }
  class Moo
  {
  };
  • 控制语句的body中只有一行时不使用大括号
  // 错误示例
  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-else结构中有一处跨多行则使用大括号
  // 错误示例
 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为空则使用大括号
  // 错误示例
 while (a);

  // 正确
 while (a) {}

圆括号

  • 使用圆括号将表达式分组

      // 错误示例
     if (a && b || c)
    
      // 正确
     if ((a && b) || c)
    
      // 错误示例
     a | b & c
    
     // 正确
     (a + b) & c
    

Switch 语句

  • case 和 switch 位于同一列
  • 每一个case必须有一个break(或renturn)语句或者用注释说明无需break
 switch (myEnum) {
 case Value1:
   doSomething();
 break;
 case Value2:
   doSomethingElse();
 // fall through
 default:
   defaultHandling();
 break;
 }

断行

  • 保持每行短于100 个字符,需要时进行断行
  • 逗号放一行的结束,操作符放到一行的开头。如果你的编辑器太窄,一个放在行尾的操作符不容易被看到。
 // 正确
 if (longExpression
  + otherLongExpression
  + otherOtherLongExpression) {
 }

 // Wrong
 if (longExpression +
   otherLongExpression +
   otherOtherLongExpression) {
 }

继承与关键字 virtual

  • 重新实现一个虚函数时,头文件中 不 放置 virtual 关键字。

通用例外

如果它使你的代码看起来不好,你可以打破任何一个规则 。

附录A 参考列表

  1. Qt编码风格/Qt Coding Style
  2. LLVM编码标准/LLVM Coding Standards
  3. 谷歌C++风格指南/Google C++ Style Guide
  4. C++核心指南/Cpp Core Guidelines