`
tomhibolu
  • 浏览: 1384574 次
文章分类
社区版块
存档分类
最新评论

Qt编码风格

 
阅读更多

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

缩进

  • 采用4个空格
  • 空格,不要用TAB!

变量

  • 每行一个变量
  • 尽可能避免短的变量名
  • 单字符的变量只在临时变量或循环的计数中使用
  • 等到真正需要使用时再定义变量
// Wrong
int a, b;
char *c, *d;
 
// Correct
int height;
int width;
char *nameOfThis;
char *nameOfThat;
  • 以小写字符开头,后续单词以大写开头
  • 避免使用缩写
// Wrong
short Cntr;
char ITEM_DELIM = '/t';
 
// Correct
short counter;
char itemDelimiter = '/t';
  • 类名总是以大写开头

补充

在Qt例子编写中,对变量名有如下建议:

  • 成员变量前不要加 "m_" 或其他什么东西
  • 如果参数名和成员变量名发生冲突,使用 "this->" 解决

void MyClass::setColor(const QColor &color;)
{
    this->color = color;
}

void MyClass::setColor(const QColor &newColor;)
{
    color = newColor;
}

避免使用 (意义不明确的字符):

void MyClass::setColor(const QColor &c)
{
    color = c;
}

注意:在构造函数中,会遇到同样的问题。但无论你信与不信,下面的可以工作

MyClass::MyClass(const QColor &color;)
    : color(color)
{
}

空白

  • 利用空行将语句恰当地分组
  • 总是使用一个空行(不要空多行)
  • 总是在每个关键字和大括号前使用一个空格
// 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
x      = rect.x();
y      = rect.y();
width  = rect.width();
height = rect.height();

大括号

  • 基本原则:左大括号和语句保持在同一行
// Wrong
if (codec)
{
}
 
// Correct
if (codec) {
}
  • 例外:函数定义和类定义中,左大括号总是单独占一行
class Moo
{
};
  • 控制语句的body中只有一行时不使用大括号
// Wrong
if (address.isEmpty()) {
    return false;
}
 
// Correct
if (address.isEmpty())
    return false;

if (x) {
    // do something strange
    yyyyyyyyy = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy +
                zzzzzzzzzzzzzzzzzzzzzz;
}
  • 例外1:如果父语句跨多行,则使用大括号
// Correct
if (address.isEmpty() || !isValid()
      || !codec) {
    return false;
}
  • 例外2:在if-else结构中,有一处跨多行,则使用大括号
// Wrong
if (address.isEmpty())
    return false;
else {
    qDebug("%s", qPrintable(address));
    ++it;
}
 
// Correct
if (address.isEmpty()) {
    return false;
} else {
    qDebug("%s", qPrintable(address));
    ++it;
}

// Wrong
if (a)
    if (b)
        ...
    else
        ...
 
// Correct
if (a) {
    if (b)
        ...
    else
        ...
}
  • 如果控制语句的body为空,则使用大括号
// 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或renturn语句,或者用注释说明无需break
switch (myEnum) {
case Value1:
    doSomething();
    break;
case Value2:
    doSomethingElse();
    // fall through
default:
    defaultHandling();
    break;
}

断行

  • 保持每行短于100 个字符(注意补充部分),需要时进行断行
  • 逗号放一行的结束,操作符放到一行的开头(操作符和同级的前一行对齐)
// Correct
if (longExpression
    + otherLongExpression
    + otherOtherLongExpression) {
}
  • 例外:如果使用的 if 语句 和 && 或者 ||,对齐需要一点调整(否则控制语句和body会较难以分辨)

//Wrong
if (dsfljfsfskjldsjkljklsjdk
    && fdsljsjdsdljklsjsjkdfs
    && dsfljkdfjkldksdfjdjkfdksfdkjld) {
    sadjdjddadhsad;
}

//Correct
if (dsfljfsfskjldsjkljklsjdk
        && fdsljsjdsdljklsjsjkdfs
        && dsfljkdfjkldksdfjdjkfdksfdkjld) {
    sadjdjddadhsad;
}

对 whle 或else if,不存在这个问题:

while (dsfljfsfskjldsjkljklsjdk
       && fdsljsjdsdljklsjsjkdfs
       && dsfljkdfjkldksdfjdjkfdksfdkjld) {
    sadjdjddadhsad;
}

补充

  • Qt 例子中比前面的标准100严格一点,采用的是80.
  • Qt Quarterly 中采用的是 58
  • Qt 书籍中采用的是 68 (?)

继承与virtual

  • 重新实现一个虚函数时,头文件中不放置 virtual 关键字
分享到:
评论

相关推荐

    QT编码风格与规范.pdf

    qt 编码规范 风格,学习qt的可以参考一下

    精通qt4编程(源代码)

    \18.4 自定义风格插件 455 \18.5 小结 458 \第19章 脚本——QtScript 459 \19.1 执行ECMAScript脚本 459 \19.2 QtScript中的信号和槽 460 \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 ...

    精通Qt4编程(第二版)源代码

    \18.4 自定义风格插件 455 \18.5 小结 458 \第19章 脚本——QtScript 459 \19.1 执行ECMAScript脚本 459 \19.2 QtScript中的信号和槽 460 \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 ...

    QT5+数据库电话计费系统

    仅供参考学习,内部没有注释,因为编码问题,没有很好的兼容,注释英文又太不合自己风格,所以略部分。不懂的部分可以自己翻文档,是非常简单的。我博客有搭建的ODBC教程,QT5MSVC+sqlserver

    cpp-java-code:我的C ++和Java代码

    exploit,Arduino,嵌入式,课设,java索引QT practice //QT 练习代码LinuxHelloWorldsignalslotc++ primer plus//《C++ primer plus》笔记及练习代码c++ programming style//《C++ 编码风格》笔记及练习代码c++ qt ...

    C&C++设计风格选择 命名规范

    对于独立开发者,花点时间设计自己的编码风格也是有助于提高能力的,至少可以在看到自己代码的时候感觉美美哒~~。本文参考了,&lt;Qt&gt;,当然还有维基百科,以后不累述。 1.1.常见命名法 蛇形命名法 [snake_case]:  ...

    itchio-app-old:桌面itch.io客户端

    构建过程也可以通过以下命令从命令行执行: $ cd itchio-app$ make$ ./build/itchio 有关可用make目标的更多信息,请阅读提供的帮助页面$ make help编码风格clang-format用于格式化代码库。 要格式化所有源文件,请...

    基于JS2Image实现圣诞树代码

    马上圣诞节了,作为一名程序猿,如何体现自己独特的过节风格,如何在朋友圈发一张专属自己的祝福照片我觉得很有必要,你们说是不是。 谈到圣诞节,话说程序猿和圣诞之间的关系还有这么一个笑话: Q:程序员为什么...

    Mudlet::crossed_swords:一个跨平台,开源,超快速的MUD客户端,带有Lua脚本

    它是游戏场景中现代风格的客户端,具有直观的用户界面,经过特殊设计的脚本框架和非常快速的文本显示。 这样,再加上跨平台功能和开源开发模型,就可以打造出非常讨人喜欢的游戏客户端。 主要特点 使用简单 非常...

    ZendFramework中文文档

    1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) ...2.1.5. 定义访问控制 ...

Global site tag (gtag.js) - Google Analytics