Обнаружение 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 по-прежнему предоставляет определенные символы), но позволяет использовать более естественный стиль для запроса возможностей компилятора. Я не знаю, планируют ли другие компиляторы определить такое средство.

Другие вопросы по тегам