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

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

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

Ответы

Ответ 1

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

#ifdef __INTEL_COMPILER

чтобы расколоть icc off, предположив gcc по умолчанию.

Ответ 2

Я считаю, что вы можете проверить __INTEL_COMPILER в соответствии с этим.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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