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