Jak rozpoznać platformę / kompilator z makr preprocesora?

Piszę wieloplatformowy kod, który powinien się skompilować pod Linuksem, windows, Mac OS. W systemie windows muszę obsługiwać visual studio i MinGW.

Jest kilka fragmentów kodu specyficznego dla platformy, które powinienem umieścić w środowisku #ifdef .. #endif. Na przykład tutaj umieściłem kod specyficzny dla win32:

#ifdef WIN32
#include <windows.h>
#endif

Ale jak rozpoznać Linuksa i mac OS? Czym są nazwy (lub etc. Powinienem użyć?

Author: Brian Tompsett - 汤莱恩, 2011-01-05

4 answers

Dla Mac OS :

#ifdef __APPLE__

Dla MingW W Windows:

#ifdef __MINGW32__

Dla Linux:

#ifdef __linux__

Dla innych kompilatorów Windows, sprawdź ten wątek i ten dla kilku innych kompilatorów i architektur.

 120
Author: karlphillip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:09

Zobacz: http://predef.sourceforge.net/index.php

Ten projekt zawiera dość obszerną listę predefiniowanych #defines dla wielu systemów operacyjnych, kompilatorów, standardów językowych i platformowych oraz bibliotek standardowych.

 58
Author: John Bartholomew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-05 15:33:26

Oto czego używam:

#ifdef _WIN32 // note the underscore: without it, it's not msdn official!
    // Windows (x64 and x86)
#elif __unix__ // all unices, not all compilers
    // Unix
#elif __linux__
    // linux
#elif __APPLE__
    // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though...
#endif

EDIT: chociaż powyższe może działać na podstawy, pamiętaj, aby sprawdzić, jakie makro chcesz sprawdzić, patrząc na wzmocnienie .Predef reference pages . Lub po prostu użyj Boost.Predef bezpośrednio.

 41
Author: rubenvb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-30 14:27:29

Jeśli piszesz C++, nie polecam używania bibliotek Boost wystarczająco mocno.

Najnowsza Wersja (1.55) zawiera nową bibliotekęPredef , która zawiera dokładnie to, czego szukasz, wraz z dziesiątkami innych makr do rozpoznawania platform i architektury.

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif
 19
Author: rvalue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 07:56:50