Piszę kod wieloplatformowy, który powinien być kompilowany pod linuxem, 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 #ifdef .. #endif
środowisku. Na przykład tutaj umieściłem kod specyficzny dla win32:
#ifdef WIN32
#include <windows.h>
#endif
Ale jak rozpoznać Linuksa i Mac OS? Jakie są nazwy definicji (lub itp.), Których powinienem użyć?
c++
macros
cross-platform
c-preprocessor
Arenim
źródło
źródło
Odpowiedzi:
W przypadku systemu Mac OS :
Dla MinGW w systemie Windows:
W systemie Linux :
Dla innych kompilatorów Windows sprawdzić ten wątek i to przez kilka innych kompilatorów i architektur.
źródło
__APPLE__
rozróżnia OSX i iOS?__APPLE__
jest ustawiony na OS X i iOS. Możesz w#include <TargetConditionals.h>
środku#ifdef __APPLE__
, co następnie dajeTARGET_OS_IPHONE #define
.__MINGW64__
jest również dostępny, gdy używa się mingw64__MINGW64__
jest_MSC_VER
przywoływany, warto wspomnieć o systemie Windows / MSVC (którego można również użyć do sprawdzenia wersji MSVC).Zobacz: http://predef.sourceforge.net/index.php
Ten projekt zawiera dość obszerną listę wstępnie zdefiniowanych
#defines
dla wielu systemów operacyjnych, kompilatorów, standardów językowych i platform oraz bibliotek standardowych.źródło
Oto czego używam:
EDYCJA: Chociaż powyższe może działać w przypadku podstaw, pamiętaj, aby zweryfikować, jakiego makra chcesz sprawdzić, patrząc na strony odniesienia Boost.Predef . Lub po prostu użyj Boost.Predef bezpośrednio.
źródło
#if
pytanie, jeśli jest zdefiniowane, pozostałe sprawdzają wartość.#elif defined(__unix__)
Myślę, że jeśli byłoby to bardziej konsekwentne , itp.Jeśli piszesz w C ++, nie mogę wystarczająco mocno polecać korzystania z bibliotek Boost .
Najnowsza wersja (1.55) zawiera nową bibliotekę Predef, która obejmuje dokładnie to, czego szukasz , a także dziesiątki innych makr do rozpoznawania platformy i architektury.
źródło