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?



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.


79

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

$ strings /usr/bin/clang | grep __ | grep -i clang
__clang__

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)


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.