Qual macro predefinida posso usar para detectar o clang?

111

Estou tentando detectar o compilador usado para compilar meu código-fonte. Posso encontrar facilmente macros predefinidas para verificar se há MSVC ou GCC (consulte http://predef.sourceforge.net/ por exemplo), mas não consigo encontrar nenhuma macro para verificar se há clang.

Alguém sabe se o clang define uma macro como __CLANG__para saber o que está compilando meu código no momento?

Pierre Bourdon
fonte

Respostas:

121

Para obter uma lista de todas as macros predefinidas que o compilador usa, use o seguinte:

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

Você pode fazer o mesmo para o gcc.

Chris Suter
fonte
79

Encontre a resposta usando strings+ grep:

$ strings /usr/bin/clang | grep __ | grep -i clang
__clang__
Pierre Bourdon
fonte
41

Esta pergunta foi respondida há anos, mas deixe-me acrescentar (para referência futura) como isso é feito no Windows :

echo | clang -dM -E -

mesmo que para GCC:

echo | gcc -dM -E -

Observação: o último traço -é realmente importante! (Caso contrário, você obtém error: no input filespara ambos os compiladores)

Bernd Elkemann
fonte
8
Para sua informação, o equivalente do Windows /dev/nulléNUL:
legalize
@legalize Whoa! Eu não sabia disso! Isso é bem legal; onde você achou isso?
MD XF
4
Ele existe desde os dias do DOS, mas a maioria dos usuários do DOS / Windows nunca precisou dele.
legalizar
Isso é o que eu geralmente faço no Linux também. Digitar /dev/nulldá mais trabalho.
Peter Cordes