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