????????Qt 提供了一系列預定義宏用于判斷 Qt 版本、操作系統平臺、編譯器特性等。這些宏在跨平臺開發中非常有用。
1. Qt 版本判斷宏
// 檢查Qt版本
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代碼
#endif// 常用版本判斷
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)// Qt6特有代碼
#elif QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)// Qt5特有代碼
#else// Qt4代碼
#endif
2. 操作系統平臺判斷?
// 操作系統平臺判斷
#ifdef Q_OS_WIN// Windows平臺特有代碼#ifdef Q_OS_WIN32// 32位Windows#endif#ifdef Q_OS_WIN64// 64位Windows#endif
#endif#ifdef Q_OS_LINUX// Linux平臺特有代碼
#endif#ifdef Q_OS_MACOS// macOS平臺特有代碼(原Q_OS_MAC在Qt5.9后建議使用Q_OS_MACOS)
#endif#ifdef Q_OS_ANDROID// Android平臺特有代碼
#endif#ifdef Q_OS_IOS// iOS平臺特有代碼
#endif#ifdef Q_OS_UNIX// 所有Unix-like系統(包括Linux、macOS等)
#endif
3. 編譯器特性判斷
// 編譯器判斷
#ifdef Q_CC_MSVC// Microsoft Visual C++編譯器
#endif#ifdef Q_CC_GNU// GCC編譯器
#endif#ifdef Q_CC_CLANG// Clang編譯器
#endif// C++標準版本判斷
#if __cplusplus >= 201703L// C++17及以上
#elif __cplusplus >= 201402L// C++14
#elif __cplusplus >= 201103L// C++11
#endif
4. 構建類型判斷?
// 調試/發布模式判斷
#ifdef QT_DEBUG// 調試模式特有代碼
#else// 發布模式代碼
#endif// 靜態/動態庫判斷
#ifdef QT_STATIC// 靜態鏈接Qt庫
#endif
5. 功能特性判斷
// 檢查Qt模塊是否可用
#ifdef QT_WIDGETS_LIB// Widgets模塊可用
#endif#ifdef QT_NETWORK_LIB// Network模塊可用
#endif#ifdef QT_SQL_LIB// SQL模塊可用
#endif// 檢查特性支持
#ifdef QT_DEPRECATED_WARNINGS// 啟用了deprecation警告
#endif#ifdef QT_RESTRICTED_CAST_FROM_ASCII// 啟用了從ASCII的受限轉換
#endif
6. 處理器架構判斷
// 處理器架構判斷
#ifdef Q_PROCESSOR_X86// x86架構
#endif#ifdef Q_PROCESSOR_ARM// ARM架構
#endif#ifdef Q_PROCESSOR_X86_64// x86_64(64位)架構
#endif
7. 實用宏定義
// 字符串化宏
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)// 標記未使用參數(避免編譯器警告)
#define Q_UNUSED(x) (void)x;// 標記函數為棄用
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)Q_DECL_DEPRECATED void oldFunction();
#endif// 標記函數為不推薦使用(但尚未棄用)
Q_DECL_DEPRECATED_X("Use newFunction() instead") void legacyFunction();
8. 條件編譯最佳實踐
// 平臺特定代碼處理示例
QString getConfigPath()
{QString path;#ifdef Q_OS_WINpath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
#elif defined(Q_OS_MACOS)path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
#elif defined(Q_OS_LINUX)path = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
#elsepath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
#endifreturn path;
}// 版本兼容處理示例
void setHighDpiScaling()
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif
}