<QtCompilerDetection> - Compiler-specific Macro Definitions

<QtCompilerDetection> 头文件包含各种特定于编译器的宏。更多内容...

Header: #include <QtCompilerDetection>

宏

详细说明

<QtCompilerDetection> 头文件提供了一系列宏(Q_CC_*),这些宏仅在应用程序使用指定的编译器进行编译时才会被定义。例如,如果应用程序使用 Forte Developer 或 Sun Studio C++ 进行编译,则会定义Q_CC_SUN 宏。

这些宏的目的是让程序员能够向其应用程序中添加特定于编译器的代码。

宏文档

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

如果应用程序使用 Edison Design Group C++ 进行编译,则该定义有效。

Q_CC_GHS

如果应用程序使用 Green Hills 优化 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.9] Q_CONSTEXPR_DTOR

在支持 C++20 的编译器上,该宏展开为 `constexpr `,此时 `__cpp_constexpr ` 的值大于或等于 `201907L`。否则,该宏展开为 `const`。

使用此宏可在 C++20 或更高版本中声明一个可在编译时构造的变量。

该宏首次引入于 Qt 6.9。

另请参阅 Q_DECL_CONSTEXPR_DTOR 。

[since 6.4] Q_CONSTINIT

当编译器支持时,强制执行常量初始化。

如果编译器支持 C++20 中的constinit 关键字、Clang 的[[clang::require_constant_initialization]] 或 GCC 的__constinit ,则此宏将展开为上述选项中首个可用的内容;否则,该宏不展开任何内容。

如果标记为 `constinit ` 的变量其初始化必须在运行时进行,则会引发编译错误。

注意: 如果常量初始化的 变量具有非平凡的销毁过程,仍可能对加载时间产生影响。

对于常量,自 C++11 起可以使用constexpr ,但constexpr 也会使变量成为const ;而constinit 虽能确保常量初始化,却不会使变量成为const :

关键字已添加immutable常量初始化
constC++98是非必需
constexprC++11是必需
constinitC++20否必选

如果 Q_CONSTINIT 变量的声明和定义是分开的,则该宏仅作用于定义,而不作用于声明:

class C {
    ~~~~
    static int count; // declaration, no Q_CONSTINIT here
};
~~~
Q_CONSTINIT int C::count = 0; // definition

该宏于 Qt 6.4 版本中引入。

[since 6.9] Q_DECL_CONSTEXPR_DTOR

在支持 C++20 的编译器上,该宏展开为 `constexpr `,此时 `__cpp_constexpr ` 的值大于或等于 `201907L`。否则,该宏展开为 `inline`。

在 C++20 或更高版本中,使用此宏可声明一个可在编译时计算的析构函数。

该宏在 Qt 6.9 中引入。

另请参阅 Q_CONSTEXPR_DTOR 。

[since 6.9] Q_DECL_EQ_DELETE_X(reason)

在支持 C++26 的编译器上,该宏展开为 `= delete(reason) `,此时 `__cpp_deleted_function ` 的值大于或等于 `202403L`。否则,该宏展开为 `= delete`。

使用此宏声明一个已删除的函数,并在该函数被调用时向用户提供错误消息(即reason ),以说明该函数被删除的原因。

该宏于 Qt 6.9 中引入。

Q_DECL_EXPORT

该宏将一个符号标记为共享库的导出项(参见“创建共享库”)。

另请参阅 Q_DECL_IMPORT 。

Q_DECL_IMPORT

该宏将一个符号声明为来自共享库的导入(参见“创建共享库”)。

另请参阅 Q_DECL_EXPORT 。

[since 6.12] Q_DECL_NONALLOCATING_FUNCTION

在支持该功能的 clang 编译器上,该函数将扩展为 `[[clang::nonallocating]] `。

声明该函数绝不会从堆中分配内存,也不会抛出异常。

该声明被 clang的函数效应分析和 实时 sanitizer 所使用。

该宏在 Qt 6.12 中引入。

另请参阅 Q_DECL_NONBLOCKING_FUNCTION 。

[since 6.12] Q_DECL_NONBLOCKING_FUNCTION

在支持该功能的 clang 编译器上,该函数会扩展为 `[[clang::nonblocking]] `。

声明该函数绝不会因锁而阻塞、不会进行堆内存分配,也不会抛出异常。

用于 clang的函数效应分析和 实时 sanitizer。

该宏在 Qt 6.12 中引入。

另请参阅 Q_DECL_NONALLOCATING_FUNCTION 。

void Q_FALLTHROUGH()

可在 switch 语句中,位于 case 代码块末尾使用,以告知编译器和其他开发人员,未使用 break 语句是故意的。

这很有用,因为缺少 break 语句通常是程序错误,而且某些编译器可以配置为在未找到 break 语句时发出警告。

另请参阅 Q_UNREACHABLE() 和Q_UNREACHABLE_RETURN()。

const char *Q_FUNC_INFO

展开为一个字符串,用于描述该宏所在的函数。该字符串的具体形式取决于编译器。在 GNU GCC 中,它通常是函数签名;而在其他编译器中,则可能是行号和列号。

Q_FUNC_INFO 可与 `qDebug()` 配合使用,操作十分便捷。例如,以下函数:

template<typenameTInputType>
constTInputType&myMin(constTInputType&value1, constTInputType&value2)
{
    qDebug() << Q_FUNC_INFO << "was called with value1:" << value1 << "value2:" << value2;

   if(value1<value2)
        returnvalue1;
    else
        returnvalue2;
}

当使用整数类型实例化时,GCC 编译器将生成:

const TInputType& myMin(const TInputType&, const TInputType&) [with TInputType = int] was called with 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()、Q_LIKELY_BRANCH 以及Q_UNLIKELY_BRANCH 。

[since 6.9] Q_LIKELY_BRANCH

提示编译器,后续代码块很可能被执行。

使用此宏可帮助编译器优化代码。

它被定义为 C++20 属性[[likely]] ,在不支持该属性的编译器上,它不执行任何操作。

该宏在 Qt 6.9 中引入。

另请参阅 Q_LIKELY()、Q_UNLIKELY() 和Q_UNLIKELY_BRANCH 。

[since 6.6] Q_NODISCARD_CTOR

在支持在构造函数中使用该语法的编译器上,该表达式展开为 `[[nodiscard]] `。

否则,它将展开为空。

如果调用处未使用生成的对象,标记为 Q_NODISCARD_CTOR 的构造函数会引发编译器警告。

此宏的存在仅是为了防止在未实现该功能的编译器上出现警告。如果您的所有支持平台都允许在构造函数上使用[[nodiscard]] ,我们强烈建议您直接使用 C++ 属性,而不是此宏。

该宏在 Qt 6.6 中引入。

另请参阅 Q_NODISCARD_CTOR_X 。

[since 6.7] Q_NODISCARD_X(message)

[since 6.7] Q_NODISCARD_CTOR_X(message)

在支持该功能的编译器上,将其展开为[[nodiscard(message)]] 。

否则,它们将分别展开为[[nodiscard]] 和Q_NODISCARD_CTOR 。

这些宏是在 Qt 6.7 中引入的。

另请参阅 Q_NODISCARD_CTOR 。

Q_UNLIKELY(expr)

向编译器提示,所包含的条件式expr 很可能评估为false 。

使用此宏可帮助编译器优化代码。

示例:

boolreadConfiguration(constQFile&file)
{
    // 我们预计会被要求读取一个已存在的文件
    if(Q_UNLIKELY(!file.exists())) {
        qWarning() << "File not found";
       return false;
    }

    //...
    return true;
}

另请参阅 Q_LIKELY()、Q_LIKELY_BRANCH 以及Q_UNLIKELY_BRANCH 。

[since 6.9] Q_UNLIKELY_BRANCH

向编译器提示后续代码块不太可能被执行。

使用此宏可帮助编译器优化代码。

它被定义为 C++20 属性[[unlikely]] ,在不支持该属性的编译器上,该宏不执行任何操作。

该宏在 Qt 6.9 中引入。

另请参阅 Q_LIKELY()、Q_UNLIKELY() 和Q_LIKELY_BRANCH 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.