Qt代码风格 [翻译]

缩进

  • 使用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)。
  • 缩略词在开头的也是用驼峰样式(如,QXmlStreamReader, 而不是 QXMLStreamReader)。

空格

  • 使用空行将语句组合在适合的地方
  • 始终只使用一个空白行
  • 始终在关键字之后和大括号之前添加一个空格:
 // 错误
 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()));
  • 不要把多个语句放在一行上
  • 通过扩展,对控制流程语句的主体使用一个新行:(原句:By extension, use a new line for the body of a control flow statement:)
 // 错误
 if (foo) bar();

 // 正确
 if (foo)
     bar();

大括号

  • 使用紧连的大括号:大括号与声明的开头位于同一行。 如果右大括号后跟另一个关键字,也要放在一行中:
 // 错误
 if (codec)
 {
 }
 else
 {
 }

 // 正确
 if (codec) {
 } else {
 }
  • 例外:函数实现(但不是lambda表达式)和类声明始终在新行行首添加左括号:
 static void foo(int g)
 {
     qDebug("foo: %i", g);
 }

 class Moo
 {
 };
  • 仅当条件语句的主体包含多行时才使用花括号:
 // 错误
 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-then-else块中使用大括号,不管if的主体或else的主体有几行:
 // 错误
 if (address.isEmpty())
     qDebug("empty!");
 else {
     qDebug("%s", qPrintable(address));
     it;
 }

 // 正确
 if (address.isEmpty()) {
     qDebug("empty!");
 } else {
     qDebug("%s", qPrintable(address));
     it;
 }

 // 错误
 if (a)
     …
 else
     if (b)
         …

 // 正确
 if (a) {
     …
 } else {
     if (b)
         …
 }
  • 当条件语句的主体为空时,使用花括号
 // 错误
 while (a);

 // 正确
 while (a) {}

小括号

  • 使用小括号将表达式分组:
 // 错误
 if (a && b || c)

 // 正确
 if ((a && b) || c)

 // 错误
 a + b & c

 // 正确
 (a + b) & c

switch语句

  • case关键词与switch位于同一列
  • 每个case最后都必须有一个break(或return)语句,或者使用Q_FALLTHROUGH()来表示有意不中断,除非要后面紧接另一个case的内容。
 switch (myEnum) {
 case Value1:
   doSomething();
   break;
 case Value2:
 case Value3:
   doSomethingElse();
   Q_FALLTHROUGH();
 default:
   defaultHandling();
   break;
 }

跳转语句 (break, continue, return, and goto)

  • 不要将else放在在跳转语句的后面:
 // 错误
 if (thisOrThat)
     return;
 else
     somethingElse();

 // 正确
 if (thisOrThat)
     return;
 somethingElse();
  • 例外:如果代码本身是对称的,则允许使用else来显示对称性

换行

  • 保持一行少于100个字符; 如有必要则折行
    • 注释/ apidoc行应保持在实际文本的80列以下。 根据周围内容进行调整,避免“锯齿”段落的方式(原文:Comment/apidoc lines should be kept below 80 columns of actual text. Adjust to the surroundings, and try to flow the text in a way that avoids "jagged" paragraphs.)
  • 逗号在被折断行的行尾,操作符在新行的行首。操作符在行尾很容易被隐藏起来,如果编辑器比较窄的话。
 // 错误
 if (longExpression +
     otherLongExpression +
     otherOtherLongExpression) {
 }

 // 正确
 if (longExpression
     + otherLongExpression
     + otherOtherLongExpression) {
 }

一般例外

  • 当严格遵守规则使你的代码看起来很糟糕的时候,不要遵守

风格艺术

可以使用下面的代码风格使得你的代码更有艺术性

--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,因为如果后续行需要缩进限制,astyle不够智能以包装第一个参数。 鼓励您手动限制在语句缩进大约50个列:(原文:Note that "unlimited" --max-instatement-indent is used only because astyle is not smart enough to wrap the first argument if subsequent lines would need indentation limitation. You are encouraged to manually limit in-statement-indent to roughly 50 colums:)

    int foo = some_really_long_function_name(and_another_one_to_drive_the_point_home(
            first_argument, second_argument, third_arugment));

官方原文链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容