Как обнаружить во время компиляции, если я использую 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.