Обнаружение ICC против GCC во время компиляции - PullRequest
16 голосов
/ 21 апреля 2011

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

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

Ответы [ 5 ]

17 голосов
/ 21 апреля 2011

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

#ifdef __INTEL_COMPILER

для разделения icc, предполагая gcc по умолчанию.

6 голосов
/ 21 апреля 2011

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

2 голосов
/ 21 апреля 2011

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

1 голос
/ 29 ноября 2012

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

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

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

1 голос
/ 21 апреля 2011

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

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

...