¿Qué macro predefinida puedo usar para detectar clang?

111

Estoy tratando de detectar el compilador utilizado para compilar mi código fuente. Puedo encontrar fácilmente macros predefinidas para buscar MSVC o GCC (ver http://predef.sourceforge.net/ por ejemplo), pero no puedo encontrar ninguna macro para verificar si hay clang.

¿Alguien sabe si clang define una macro como __CLANG__para saber qué está compilando actualmente mi código?

Pierre Bourdon
fuente

Respuestas:

120

Para obtener una lista de todas las macros predefinidas que usa el compilador, use esto:

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

Puedes hacer lo mismo con gcc.

Chris Suter
fuente
79

Encontré la respuesta usando strings+ grep:

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

Esta pregunta ha sido respondida durante años, pero permítame agregar (para referencia futura) cómo se hace en Windows :

echo | clang -dM -E -

lo mismo que para GCC:

echo | gcc -dM -E -

Tenga en cuenta: ¡El último guión -es realmente importante! (De lo contrario, obtienes error: no input filespara ambos compiladores)

Bernd Elkemann
fuente
8
Para su información, el equivalente de Windows /dev/nullesNUL:
legalizar el
@legalize ¡Whoa! ¡Yo no lo sabía! Eso es muy bonito; donde encontraste eso?
MD XF
4
Ha estado ahí desde los días de DOS, pero la mayoría de los usuarios de DOS / Windows nunca lo necesitaron.
legalizar el
Esto es lo que suelo hacer también en Linux. Escribir /dev/nulles más trabajo.
Peter Cordes