2013-07-05 11 views
27

chcę zrobić coś takiego:Jak wykryć g ++ i MinGW w preprocesorze C++?

#ifdef GCC 
#define GetFunctionName() string("My function name is ") + __PRETTY_FUNCTION__; 
#endif 

Ponieważ chcę użyć dość PRETTY_FUNCTION ten jest obsługiwany tylko przez gnu o ile wiem, więc trzeba wykryć, czy jestem kompilacji dla g ++ i MinGW, jak mogę to zrobić? Zgaduję, że wszystko, co muszę wiedzieć, to preprocesorowe definicje kompilatora, tak jak zrobiłem to dla Microsoftu poniżej.

#ifdef WIN32 
#define LogFuncBegin() gLogger.FuncBegin(__FUNCTION__); 
#define LogFuncEndSuccess() gLogger.FuncEndSuccess(__FUNCTION__); 
#endif 

Jak wykryć g ++ i MinGW w preprocesorze C++?

Odpowiedz

36

Można skorzystać z:

#ifdef __GNUC__ 
#ifdef __MINGW32__ 

uzyskać dodatkowe makra może być zainteresowany w this page który pokazuje inne makra kompilatora

+0

Czy Twoje przypadki testowe zawierały MinGW-64? – jww

+0

@jww Nie, ale MinGW-64 również zdefiniuje 32 makro, więc to też będzie działać. –

+1

Bardziej aktualna wersja tej listy makr kompilatora znajduje się w projekcie [Wstępnie zdefiniowane makra kompilujące na sourceforge] (https://sourceforge.net/p/predef/wiki/Home/) – rakslice

23

GCC:

#ifdef __GNUC__ 

Na MinGW:

#ifdef __MINGW32__ 

x86_64-W64-mingw32-GCC określa zarówno __MINGW32__ i __MINGW64__.

+2

Czy wasze przypadki testowe obejmują MinGW-64? – jww

+2

Ta odpowiedź została napisana przed MinGW-64. Ale myślę, że definiuje makro "__MINGW32__". Tak powinno nadal działać – sedavidw

+0

To jest pewien punkt sporny. Nie mogę znaleźć [MinGW-64 oferowanego przez projekt] (http://www.mingw.org/) .... Nie ma sensu rozwiązywać problemu, który nie istnieje .... – jww