在编译时检测 ICC 与 GCC

发布于 2024-11-02 07:33:08 字数 154 浏览 8 评论 0原文

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

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

How to detect at compile time if I'm using gcc or icc?

(I was quite puzzled to find out that icc defines __GNUC__ -- and even __GNUC_MINOR__ and __GNUC_PATCHLEVEL__ ! why?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

稀香 2024-11-09 07:33:08

我们使用

#ifdef __INTEL_COMPILER

分离icc,假设gcc作为默认值。

We use

#ifdef __INTEL_COMPILER

to split icc off, assuming gcc as a default.

枕梦 2024-11-09 07:33:08

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

I believe you could check for __INTEL_COMPILER according to this.

海未深 2024-11-09 07:33:08

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

The reason ICC defines __GNUC__ etc. is because of code like yours that is inspecting compiler-specific macros and expects to see them...

黄昏下泛黄的笔记 2024-11-09 07:33:08

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

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

Traditionally, compilers have defined a symbol of their own as well as their version as preprocessor symbols so that the code could be adapted (generally to work around bugs or specificities).

CLang has introduced a mechanism I had not seen so far, under the form of the __has_feature query. It does not replace the "work around bugs" practices (which is why CLang still exposes specific symbols) but allows a more natural style for querying the compiler capacities. I don't know if other compilers plan on defining such a facility.

叹沉浮 2024-11-09 07:33:08

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

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

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

You can make the processor output the defined macros in the preprocessor output and look for a macro that suits you. You can generated the preprocessor output like this:

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

Then look at foo.P (since it is a text file). In my case, I found icc defined an __ICC macro with the version of the compiler. It didn't define any __INTEL_COMPILER though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文