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ć?
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.
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.
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.
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
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