首页| 论坛| 消息
主题:Qt 编程惯例(Qt Coding Convensions)与电子版下载(本文已被Qt官网采用为官方标准中文翻译)
wd007发表于 2011-07-02 21:29
前阵子,与XChinux一起翻译了《Qt Coding Convensions》一文,并请齐亮审校。

现将这篇译文与大家分享,也请大家参与进来,有不当的地方,请指出,我们及时改进。

原文链接:http://blog.csdn.net/qter_wd007/article/details/6557191

电子版下载:

下面试着贴出来,可能版式会有变化,如果不好看,大家可以去上面的链接去看原文。

另注:本文已被Qt官网采用为官方的中文翻译,谢谢大家的支持。详见原文链接之“简体中文”。

Qt 编程惯例

原文链接:http://developer.qt.nokia.com/wiki/Coding_Conventions
翻 译:wd007 XChinux
审 校:齐 亮

◆ C++ 特性

■ 不要使用异常
■ 不要使用rtti(运行时类型识别;主要包括,typeinfo结构,dynamic或者typeid操作符,包括抛出异常等)
■ 慎明的使用模板类,只有当必需时才使用它,而不是仅仅因为你掌握了它的使用方法。
提示:使用编译器的自动测试功能来确定某个C++特性是否被支持。
◆ Qt源代码书写惯例

■ 所有代码都仅仅使用ascii格式(7位字符,如果不确定,则可以运行man ascii来验证 )
● 原理:我们已经有了太多的新的语系作品以及UTF-8和Latin1混合的不健壮的系统。当你在喜欢使用的编辑器中使用字符位数大于127的系统时,往往还没有来得及保存,系统就会崩溃掉。
● 对于字符串:使用/nnn(这里nnn是八进制的字符,在任何系统中都可以代表你要输入的字符)或者使用/xnn(这里xnn是十六进制的字符)。
举例:
QString s = QString::fromUtf8(”/213/005”);
● 对于文档中的变音,或者其他非ASCII的字符,或者使用qdoc的unicode命令或者使用适当的宏;举例:对ü使用/uuml。
■ 所有QObject的子类都必须包含一个Q_OBJECT的宏,即便它并没有使用信号或者槽,否则的话,qobject_cast就会运行失败。
■ 在连接语句中,规范化信号和槽中的参数(可以查看QMetaObject::normalizedSignature以获得规范化的信息)以获得更快速的信号/槽遍历。你也可以使用$QTDIR/util/normalize来规范已有的代码
◎ 包含的头文件
■ 在公用的头文件中,头文件包含总是使用这样的形式:
#include
对于Mac OS X系统框架而言,QtCore这样的库前缀是必需的,这样的写法对非qmake项目也是非常便利的
■ 在源文件中,先包含特定的头文件,再包含常用的头文件(如系统文件)
举例:
#include // Qt 的类
#include // 标准模板库中的模块
#include // 系统文件
■ 如果要包含qplatformdefs.h,总是第一个包含它
■ 如果要包含qt_x11_p.h,总是最后一个包含它
◎ 强制转换
■ 避免使用C风格的转换,使用C++风格的转换(static_cast, const_cast, reinterpret_cast)
● 原理:reinterpret_cast以及C风格的转换都是危险的,但好在前者在转换过程中并不去掉const修饰符
■ 不要使用dynamic_cast,对QObject及其子类对象使用qobject_cast或者重构你的设计,例如引入一个type()方法(参考QListWidgetItem)
■ 对于简单的变量类型转换,使用构造函数实现。注意形式是:int(myFloat)而不是(int)myFloat
● 原理:当重构代码时,编译器会立即告诉开发者这种转换是否会带来危险
◎ 编译器/平台特定问题
■ 当使用有疑问的操作符时,要格外的小心。如果返回值类型不一致,某些编译器生成的代码在运行时会崩溃(你甚至不会得到编译器给出的警告信息)
QString s;
return condition ? s : ”nothing”;//运行时崩溃
■ 对字节对齐问题要格外的小心
●无论何时,进行一个指针转换以致于需要目标进行对齐而导致字节增加,其结果可能致使在某些系统架构上运行时产生崩溃。举个例子,如果一个constchar *类型转换为一个const int *,这会在整型必须被对齐到两个或四个字节边界的机器上导致崩溃。
● 使用一个联合体来强制编译器正确的对变量进行对齐。在下面的例子中,你能够确定AlignHelper的所有实例在整数的边界处对齐。
union AlignHelper [1]
{
char c;
int i;
};
■在库代码中,任何具有一个构造函数或需要运行一段代码来初始化的变量不能被用做全局对象。因为其构造函数或这段代码什么时候运行是未定义的(在第一次使用时,在库加载时,在main()函数之前或者其它场合)。甚至是在共享库中已定义了的初始化过程执行时,在将这段代码移到一个插件中或者这个库是被静态编译的时候会遇到麻烦。
// 全局域
static const QString x; // 错误 - 缺省构造函数需要在初始化x变量时运行
static const QString y = "Hello"; // 错误 - 必须要运行以const char *类型为参数的构造函数
QString z;// 大错特错
static const int i = foo
描述:Qt 编程惯例(Qt Coding Convensions)
附件: Qt编码标准与编程惯例修改稿2改_LiveWritter版.7z (125 K) 下载次数:2120
下一页 (1/4)
回帖(17):
17楼:很棒!!赞一个!
16楼:谢谢分享
15楼:good,感谢

全部回帖(17)»
最新回帖
收藏本帖
发新帖