QT编写跨平台代码注意事项

12 篇文章 0 订阅
本文详细列举了C++编程中的一些关键规范和最佳实践,包括大小写敏感性、路径处理、避免使用特定平台扩展、遵循C++标准、利用QT或标准库、避免平台相关API、选择合适的数据类型、宏定义注意事项、函数参数const修饰、条件表达式使用以及防止头文件重复包含等。这些规范有助于提高代码质量、可读性和跨平台兼容性。
摘要由CSDN通过智能技术生成
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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值