1.注意大小写(文件名,路径,控件提升名称等)
2.路径使用正斜杠,不使用反斜杠
对于平台特定要求,使用QDir::toNativeSeparators()进行转换
3.不在自定义的命名空间里面使用Q_DELCARE_METATYPE
namespace myspace{
struct stru{
int x;
}
Q_DELCARE_METATYPE(myspace::stru) //BAD!!!!
}
Q_DELCARE_METATYPE(myspace::stru) //GOOD!!!!
4. 尽量不要使用VS的扩展. 如__super, for each等
for each //BAD!!!!
std::for_each //GOOD!!!
C++11 for base range //GOOD!!!!
5. VS工程使用符合模式(可以规范条款4)
工程->[属性]->[C/C++]->[语言]->[符合模式] 改为"是(/permissive-)"
符合模式下,编译器将严格使用C++语言标准规范对代码进行检查。譬如将右值复制给左值引用,条例4中提到的for each和__super等的使用在符合模式下都会当做错误处理。 符合模式有利于写出更正确和更加跨平台的代码。
6.在满足产品需求的前提下,尽量使用QT或者标准C++来编写相关代码,而不是直接调用平台相关的API
线程睡眠:
Sleep(100); //BAD!!! Only Windows!
QThread::msleep(100); //GOOD!!!
7.尽量使用QT或者标准C++提供的数据类型,而不是平台相关的宏
譬如: __int64不是c++标准类型,使用qint64代替
8.定义一个可变参数宏时,如果可变参数前有其他参数,那么展开宏时,在_VA_ARGS_ 前面加上##(告诉编译器如果可变参数为空,去掉前面的逗号. MSVC感觉聪明点,不强制要求加##,GCC就不行)
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__) //__VA_ARGS__前面加上##
9.注意函数参数的const修饰符. 如果复制构造,拷贝构造等.
错误示范:
class KStatusItemData : public QObject {
Q_OBJECT
public:
KStatusItemData();
KStatusItemData(const KStatusItemData& data);
KStatusItemData(KNetData kNetData, int eDataSrc = ENDS_None, int nRoleIdentity = 0);
KStatusItemData(KDaemonLib::KDaemonNetDataItem kDaemonNetData, int eDataSrc = ENDS_Daemon);
~KStatusItemData();
bool operator==(const KStatusItemData &other);
// KStatusItemData& operator=(KStatusItemData &other); //BAD!! 参数other忘了加上const修饰,导致QList::append()时编译不过(GCC)
KStatusItemData& operator=(const KStatusItemData &other); //GOOD!!
}
10.条件表达式和if…else并不是等价的
void KTimeLayerItem::enterEdit() {
_layerEditor->enterEdit();
}
bool KTimeProgramWidget::menuExec(int nMenuID) {
.............
case MENU_TL_LAYER_RENAME: {
_pCurrentLayer ? _pCurrentLayer->enterEdit() : 1; //BAD!!!!!! void和1类型不一致!
.................
}
11.被预编译头包含的头文件,使用#ifdef…#define…#endif防止重复包含,(#pragma once 兼容性好像有点问题)
/** A.h */
//#pragma once /** BAD!!! 有兼容性问题 */
#ifdef A_H
#define A_H
class A(){
.......
}
#endif
/** stdafx.h */
#ifdef STDAFX_H
#define STDAFX_H
#include "A.h"
#endif