Как определить во время компиляции, использую ли я gcc или icc?
(Я был весьма озадачен, узнав, что icc определяет __GNUC__
-- и даже __GNUC_MINOR__
и __GNUC_PATCHLEVEL__
! Почему?)
Как определить во время компиляции, использую ли я gcc или icc?
(Я был весьма озадачен, узнав, что icc определяет __GNUC__
-- и даже __GNUC_MINOR__
и __GNUC_PATCHLEVEL__
! Почему?)
Мы используем
#ifdef __INTEL_COMPILER
чтобы разделить icc
, предполагая gcc
по умолчанию.
Думаю, вы могли бы проверить наличие __INTEL_COMPILER
в соответствии с этим.
Причина, по которой ICC определяет __GNUC__
и т. д., заключается в том, что такой код, как ваш, проверяет макросы, специфичные для компилятора, и ожидает их увидеть...
__GNUC__
. Это не означает, что компилятор является GNU-реализацией языка GNU C.
- person Peter Cordes; 08.11.2016
Традиционно компиляторы определяли свой собственный символ, а также свою версию в качестве символов препроцессора, чтобы код можно было адаптировать (обычно для устранения ошибок или особенностей).
CLang представил механизм, которого я до сих пор не видел, в виде запроса __has_feature
. Он не заменяет практики «обхода ошибок» (поэтому CLang по-прежнему предоставляет определенные символы), но позволяет использовать более естественный стиль для запроса возможностей компилятора. Я не знаю, планируют ли другие компиляторы определять такое средство.
Вы можете заставить процессор выводить определенные макросы в выводе препроцессора и искать макрос, который вам подходит. Вы можете сгенерировать вывод препроцессора следующим образом:
icc -dM -E -o foo.P foo.c
Затем посмотрите на foo.P
(поскольку это текстовый файл). В моем случае я обнаружил, что icc
определил макрос __ICC
с версией компилятора. Однако он не определял никаких __INTEL_COMPILER
.
gcc
наicc
с точно такими же параметрами, ничего не нарушая (или это идея). - person rubenvb   schedule 21.04.2011