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
}