Jakiego wstępnie zdefiniowanego makra mogę użyć do wykrywania brzęku?

111

Próbuję wykryć kompilator użyty do skompilowania mojego kodu źródłowego. Mogę łatwo znaleźć predefiniowane makra do sprawdzenia MSVC lub GCC (patrz na przykład http://predef.sourceforge.net/ ), ale nie mogę znaleźć żadnego makra do sprawdzenia, czy nie ma clang.

Czy ktoś wie, czy clang definiuje takie makro __CLANG__, aby wiedzieć, co aktualnie kompiluje mój kod?

Pierre Bourdon
źródło

Odpowiedzi:

121

Aby uzyskać listę wszystkich wstępnie zdefiniowanych makr, których używa kompilator, użyj tego:

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

Możesz zrobić to samo dla gcc.

Chris Suter
źródło
79

Znalazłem odpowiedź za pomocą strings+ grep:

$ strings /usr/bin/clang | grep __ | grep -i clang
__clang__
Pierre Bourdon
źródło
41

Na to pytanie odpowiadano od lat, ale pozwólcie, że dodam (na przyszłość), jak to się robi w systemie Windows :

echo | clang -dM -E -

tak samo jak w GCC:

echo | gcc -dM -E -

Uwaga: ostatnia kreska -jest naprawdę ważna! (W przeciwnym razie otrzymasz error: no input filesdla obu kompilatorów)

Bernd Elkemann
źródło
8
FYI, odpowiednik systemu Windows /dev/nulltoNUL:
zalegalizuj
@legalizuj Whoa! Nie wiedziałem tego! To fajnie; gdzie to znalazłeś?
MD XF
4
Jest tam od czasów DOS, tylko większość użytkowników DOS / Windows nigdy tego nie potrzebowała.
zalegalizować
To jest to, co zwykle robię również w Linuksie. Pisanie /dev/nullto więcej pracy.
Peter Cordes,