Обнаружение ICC против GCC во время компиляции

Как определить во время компиляции, использую ли я gcc или icc?

(Я был весьма озадачен, узнав, что icc определяет __GNUC__ -- и даже __GNUC_MINOR__ и __GNUC_PATCHLEVEL__ ! Почему?)


person Znorg    schedule 20.04.2011    source источник
comment
Clang также определяет их, они предназначены для совместимости: вы можете просто заменить команду gcc на icc с точно такими же параметрами, ничего не нарушая (или это идея).   -  person rubenvb    schedule 21.04.2011


Ответы (5)


Мы используем

#ifdef __INTEL_COMPILER

чтобы разделить icc, предполагая gcc по умолчанию.

person Dirk Eddelbuettel    schedule 20.04.2011

Думаю, вы могли бы проверить наличие __INTEL_COMPILER в соответствии с этим.

person cnicutar    schedule 20.04.2011
comment
Это более прозрачно boost.org/doc/libs/ 1_59_0/boost/config/compiler/intel.hpp - person alfC; 11.03.2021

Причина, по которой ICC определяет __GNUC__ и т. д., заключается в том, что такой код, как ваш, проверяет макросы, специфичные для компилятора, и ожидает их увидеть...

person R.. GitHub STOP HELPING ICE    schedule 20.04.2011
comment
Вы говорите так, будто это а) его вина, б) нехорошо делать это без каких-либо объяснений. - person Zulan; 04.02.2016
comment
Другими словами, ICC реализует диалект GNU C (и C++), и на это указывает наличие __GNUC__. Это не означает, что компилятор является GNU-реализацией языка GNU C. - person Peter Cordes; 08.11.2016

Традиционно компиляторы определяли свой собственный символ, а также свою версию в качестве символов препроцессора, чтобы код можно было адаптировать (обычно для устранения ошибок или особенностей).

CLang представил механизм, которого я до сих пор не видел, в виде запроса __has_feature. Он не заменяет практики «обхода ошибок» (поэтому CLang по-прежнему предоставляет определенные символы), но позволяет использовать более естественный стиль для запроса возможностей компилятора. Я не знаю, планируют ли другие компиляторы определять такое средство.

person Matthieu M.    schedule 21.04.2011

Вы можете заставить процессор выводить определенные макросы в выводе препроцессора и искать макрос, который вам подходит. Вы можете сгенерировать вывод препроцессора следующим образом:

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

Затем посмотрите на foo.P (поскольку это текстовый файл). В моем случае я обнаружил, что icc определил макрос __ICC с версией компилятора. Однако он не определял никаких __INTEL_COMPILER.

person Genís    schedule 29.11.2012