【问题标题】:Detect ICC vs GCC at compile time在编译时检测 ICC 与 GCC
【发布时间】:2011-04-20 21:21:32
【问题描述】:

如何在编译时检测我使用的是 gcc 还是 icc?

(我很困惑地发现 icc 定义了 __GNUC__ —— 甚至 __GNUC_MINOR____GNUC_PATCHLEVEL__ !为什么?)

【问题讨论】:

  • Clang 也定义了这些,它们是出于兼容性目的:您可以将 gcc 命令替换为 icc,使用完全相同的选项,而不会破坏任何东西(或者这就是想法)。

标签: c++ c gcc icc predefined-macro


【解决方案1】:

我们使用

#ifdef __INTEL_COMPILER

icc 拆分为关闭,假设gcc 作为默认值。

【讨论】:

    【解决方案2】:

    我相信你可以根据this检查__INTEL_COMPILER

    【解决方案3】:

    ICC 定义 __GNUC__ 等的原因是因为像您这样的代码正在检查特定于编译器的宏并希望看到它们...

    【讨论】:

    • 你说得好像是a)他的错,b)不做任何解释就不是一件好事。
    • 另一种说法是ICC实现了C(和C++)的GNU方言,这就是__GNUC__的存在所表明的。这并不意味着编译器是 GNU C 语言的 GNU 实现。
    【解决方案4】:

    传统上,编译器将自己的符号及其版本定义为预处理器符号,以便可以调整代码(通常是为了解决错误或特殊性)。

    CLang 以__has_feature 查询的形式引入了一种我迄今为止从未见过的机制。它不会取代“解决错误”的做法(这就是 CLang 仍然公开特定符号的原因),但允许使用更自然的方式来查询编译器容量。我不知道其他编译器是否计划定义这样的工具。

    【讨论】:

      【解决方案5】:

      您可以让处理器输出预处理器输出中定义的宏,并寻找适合您的宏。您可以像这样生成预处理器输出:

      icc  -dM -E -o foo.P foo.c
      

      然后查看foo.P(因为它是一个文本文件)。在我的例子中,我发现icc 用编译器的版本定义了一个__ICC 宏。但它没有定义任何__INTEL_COMPILER

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 2011-05-25
        • 1970-01-01
        • 2013-03-11
        • 2010-09-16
        • 1970-01-01
        相关资源
        最近更新 更多