Какой предопределенный макрос я могу использовать для обнаружения лязга?

111

Я пытаюсь определить компилятор, использованный для компиляции моего исходного кода. Я легко могу найти предопределенные макросы для проверки MSVC или GCC ( например, см. Http://predef.sourceforge.net/ ), но я не могу найти ни одного макроса для проверки на наличие clang.

Кто-нибудь знает, определяет ли clang макрос, например __CLANG__, чтобы узнать, что в настоящее время компилирует мой код?

Пьер Бурдон
источник

Ответы:

121

Чтобы получить список всех предопределенных макросов, которые использует компилятор, используйте это:

clang -dM -E -x c /dev/null

Вы можете сделать то же самое для gcc.

Крис Сутер
источник
79

Нашел ответ с помощью strings+ grep:

$ strings /usr/bin/clang | grep __ | grep -i clang
__clang__
Пьер Бурдон
источник
41

На этот вопрос ответили годами, но позвольте мне добавить (для справки в будущем), как это делается в Windows :

echo | clang -dM -E -

то же, что и для GCC:

echo | gcc -dM -E -

Обратите внимание: последний штрих -действительно важен! (В противном случае вы получите error: no input filesдля обоих компиляторов)

Бернд Элькеманн
источник
8
К вашему сведению, Windows эквивалент /dev/nullisNUL:
legalize
@legalize Ого! Я этого не знал! Это круто; где ты это нашел?
MD XF
4
Он существует со времен DOS, просто большинству пользователей DOS / Windows он никогда не нужен.
легализовать
Это то, что я обычно делаю в Linux. Печатать /dev/null- это больше работать.
Питер Кордес