<Qt编译器检测> - 针对编译器的宏定义
<QtCompilerDetection> 头文件包含了各种针对特定编译器的宏。 更多信息...
头文件 | #include <QtCompilerDetection> |
宏
(自 6.7) | |
Q_CC_BOR | |
Q_CC_CDS | |
Q_CC_CLANG | |
Q_CC_COMEAU | |
Q_CC_DEC | |
Q_CC_EDG | |
Q_CC_GHS | |
Q_CC_GNU | |
Q_CC_HIGHC | |
Q_CC_HPACC | |
Q_CC_KAI | |
Q_CC_MIPS | |
Q_CC_MSVC | |
Q_CC_OC | |
Q_CC_PGI | |
Q_CC_SUN | |
Q_CC_SYM | |
Q_CC_USLC | |
Q_CC_WAT | |
(自 6.4) | Q_CONSTINIT |
Q_DECL_EXPORT | |
Q_DECL_IMPORT | |
void | Q_FALLTHROUGH |
const char* | Q_FUNC_INFO |
Q_LIKELY(expr) | |
(自 6.6) | Q_NODISCARD_CTOR |
(自 6.7) | Q_NODISCARD_CTOR_X(message) |
(自 6.7) | Q_NODISCARD_X(message) |
Q_UNLIKELY(expr) |
详细描述
<QtCompilerDetection> 头文件提供了一组宏(Q_CC_*),如果应用程序使用指定的编译器编译,则会定义这些宏。例如,如果应用程序使用 Forte Developer 或 Sun Studio C++ 编译,则定义了 Q_CC_SUN 宏。
这些宏的目的是使程序员能够向其应用程序添加针对编译器的代码。
宏文档
在支持功能的编译器上展开为 [[nodiscard(message)]]
。
否则它们分别展开为 [[nodiscard]]
和 Q_NODISCARD_CTOR。
此函数在 Qt 6.7 中引入。
另请参阅 Q_NODISCARD_CTOR。
Q_CC_BOR
如果应用程序使用 Borland/Turbo C++ 编译,则定义。
Q_CC_CDS
如果应用程序使用 Reliant C++ 编译,则定义。
Q_CC_CLANG
如果应用程序使用 Clang 编译,则定义。
Q_CC_COMEAU
如果应用程序使用 Comeau C++ 编译,则定义。
Q_CC_DEC
如果应用程序使用 DEC C++ 编译,则定义。
Q_CC_EDG
如果应用程序是用埃迪生设计小组C++编译的,则定义此宏。
Q_CC_GHS
如果应用程序是用Green Hills Optimizing C++编译器编译的,则定义此宏。
Q_CC_GNU
如果应用程序是用GNU编译器集合(GCC)编译的,则定义此宏。
Q_CC_HIGHC
如果应用程序是用MetaWare High C/C++编译的,则定义此宏。
Q_CC_HPACC
如果应用程序是用HP aC++编译的,则定义此宏。
Q_CC_KAI
如果应用程序是用KAI C++编译的,则定义此宏。
Q_CC_MIPS
如果应用程序是用MIPSpro C++编译的,则定义此宏。
Q_CC_MSVC
如果应用程序是用Microsoft Visual C/C++、Intel C++ for Windows编译的,则定义此宏。
Q_CC_OC
如果应用程序是用CenterLine C++编译的,则定义此宏。
Q_CC_PGI
如果应用程序是用Portland Group C++编译的,则定义此宏。
Q_CC_SUN
如果应用程序是用Forte Developer或Sun Studio C++编译的,则定义此宏。
Q_CC_SYM
如果应用程序是用Digital Mars C/C++(以前称为Symantec C++)编译的,则定义此宏。
Q_CC_USLC
如果应用程序是用SCO OUDK和UDK编译的,则定义此宏。
Q_CC_WAT
如果应用程序是用Watcom C++编译的,则定义此宏。
[since 6.4]
Q_CONSTINIT
在编译器支持的情况下强制常量初始化。
如果编译器支持C++20的constinit
关键字,Clang的[[clang::require_constant_initialization]]
或GCC的__constinit
,则此宏扩展为这些中第一个可用者,否则不展开。
标记为constinit
的变量如果其初始化需要在运行时执行,则会引发编译错误。
注意:如果变量具有非平凡析构函数,则常量初始化的变量仍然可能有加载时间影响。
对于常量,您可以从C++11开始使用constexpr
,但constexpr
使得变量也变成const
,而constinit
确保常量初始化,但不会使变量成为const
。
关键字 | 添加 | 不可变 | 常量初始化 |
---|---|---|---|
常量 | C++98 | 是 | 不需要 |
constexpr | C++11 | 是 | 需要 |
constinit | C++20 | 不需要 | 需要 |
此宏是在Qt 6.4中引入的。
Q_DECL_EXPORT
此宏将符号标记为共享库导出(请参阅创建共享库)。
另请参阅:Q_DECL_IMPORT.
Q_DECL_IMPORT
此宏声名一个符号为从共享库导入(见 创建共享库)。
另请参阅 Q_DECL_EXPORT。
void Q_FALLTHROUGH
可以用于switch语句的case块末尾,以告诉编译器和开发人员缺失break语句是有意为之。
这很有用,因为缺少break语句通常是一个错误,并且可以配置一些编译器在找不到时发出警告。
另请参阅 Q_UNREACHABLE() 和 Q_UNREACHABLE_RETURN。
const char*Q_FUNC_INFO
展开为一个字符串,描述宏所在函数。具体的外观取决于编译器。在GNU GCC上通常是函数签名,而其他编译器可能是行和列号。
Q_FUNC_INFO可以方便地与qDebug一起使用。例如,此函数
template<typename TInputType> const TInputType &myMin(const TInputType &value1, const TInputType &value2) { qDebug() << Q_FUNC_INFO << "was called with value1:" << value1 << "value2:" << value2; if(value1 < value2) return value1; else return value2; }
使用整型实例化时,将使用GCC编译器产生
const TInputType& myMin(const TInputType&, const TInputType&) [with TInputType = int] 调用了 value1: 3 value2: 4
如果在此宏不在函数中使用,则行为是未定义的。
Q_LIKELY(expr)
向编译器提示封装的条件expr倾向于评估为true
。
使用此宏可以帮助编译器优化代码。
示例
// the condition inside the "if" will be successful most of the times for (int i = 1; i <= 365; i++) { if (Q_LIKELY(isWorkingDay(i))) { ... } ... }
另请参阅 Q_UNLIKELY。
[since 6.6]
Q_NODISCARD_CTOR
在支持它的编译器上扩展为[[nodiscard]]
。
否则,它将扩展为空。
标记为Q_NODISCARD_CTOR的构造函数如果在调用点未使用生成的对象,则会造成编译器警告。
此宏的存在 solely 仅是为了防止在不实现该功能的编译器上发出警告。如果您的支持平台都允许在构造函数上使用[[nodiscard]]
,我们强烈建议您直接使用C++属性而不是此宏。
此宏是在Qt 6.6中引入的。
另请参阅 Q_NODISCARD_CTOR_X。
[自 6.7]
Q_NODISCARD_CTOR_X(message)
此宏是在Qt 6.7中引入的。
[自 6.7]
Q_NODISCARD_X(message)
此宏是在Qt 6.7中引入的。
Q_UNLIKELY(expr)
向编译器提示封装的条件expr倾向于评估为false
。
使用此宏可以帮助编译器优化代码。
示例
bool readConfiguration(const QFile &file) { // We expect to be asked to read an existing file if (Q_UNLIKELY(!file.exists())) { qWarning() << "File not found"; return false; } ... return true; }
另请参阅 Q_LIKELY。
© 2024 The Qt Company Ltd. 本文件中包含的文档贡献受其各自所有者的版权所有。此处提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款授予许可。Qt和相应的标志是The Qt Company Ltd.在芬兰和/或全世界其他国家的商标。所有其他商标均为其各自所有者的财产。