Potrzebuję mojego kodu do robienia różnych rzeczy w zależności od systemu operacyjnego, na którym został skompilowany. Szukam czegoś takiego:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Czy jest na to sposób? Czy istnieje lepszy sposób na zrobienie tego samego?
c
operating-system
c-preprocessor
conditional-compilation
perimosocordiae
źródło
źródło
C
toC++
Odpowiedzi:
Witryna Predefiniowane makra dla systemu operacyjnego ma bardzo kompletną listę kontroli. Oto kilka z nich, wraz z linkami do miejsca ich znalezienia:
Windows
_WIN32
_WIN64
Tylko 32-bitowy i 64-bitowy tylko 64-bitowyUnix (Linux, * BSD, Mac OS X)
Zobacz to pokrewne pytanie dotyczące niektórych pułapek korzystania z tego czeku.
unix
__unix
__unix__
Mac OS X
__APPLE__
__MACH__
Oba są zdefiniowane; sprawdzanie obu powinno działać.
Linux
__linux__
linux
Przestarzałe (niezgodne z POSIX)__linux
Przestarzałe (niezgodne z POSIX)FreeBSD
__FreeBSD__
Android
__ANDROID__
źródło
__unix__
. Dlaczego warto umieścić to na liście?unix
symbole i nie definiujewin32
tych, więc bądź ostrożny. OTOH to określa__CYGWIN__
.__linux__
taki sam jak__ANDROID__
??pokaż GCC określa w systemie Windows:
w systemie Linux:
Predefiniowane makra w MinGW:
w systemach UNIX:
źródło
Na podstawie nadeausoftware i odpowiedzi Lambdy Fairy .
Testowany z GCC i clang na:
źródło
W większości przypadków lepiej jest sprawdzić, czy dana funkcjonalność jest obecna, czy nie. Na przykład: jeśli funkcja
pipe()
istnieje, czy nie.źródło
źródło
Wstępnie zdefiniowane makra kompilatora Microsoft C / C ++ (MSVC) można znaleźć tutaj
Myślę, że szukasz:
Kompilator gcc PreDefined MAcros można znaleźć tutaj
Myślę, że szukasz:
Zrób google dla swoich predefiniowanych kompilatorów.
źródło
Nie ma standardowego makra ustawionego zgodnie ze standardem C. Niektóre kompilatory C ustawiają jeden na niektórych platformach (np. Załatany GCC Apple ustawia makro wskazujące, że kompiluje się na systemie Apple i na platformie Darwin). Twoja platforma i / lub kompilator C również mogą coś ustawić, ale nie ma ogólnego sposobu.
Jak powiedział hayalci, najlepiej jest ustawić te makra w procesie kompilacji. W większości kompilatorów łatwo jest zdefiniować makro bez modyfikowania kodu. Możesz po prostu przejść
-D MACRO
do GCC, tjI w twoim kodzie:
źródło
W MinGW
_WIN32
kontrola zdefiniowania nie działa. Oto rozwiązanie:Aby uzyskać więcej informacji, patrz: https://sourceforge.net/p/predef/wiki/OperatingSystems/
źródło
Użyj
#define OSsymbol
i#ifdef OSsymbol
gdzie OSsymbol jest#define
zdolnym symbolem identyfikującym twój docelowy system operacyjny.Zazwyczaj należy dołączyć centralny plik nagłówka definiujący wybrany symbol systemu operacyjnego i używać specyficznych dla systemu operacyjnego katalogów włączeń i bibliotek do kompilacji i kompilacji.
Nie określiłeś swojego środowiska programistycznego, ale jestem prawie pewien, że Twój kompilator zapewnia globalne definicje popularnych platform i systemów operacyjnych.
Zobacz także http://en.wikibooks.org/wiki/C_Programming/Preprocessor
źródło
Podsumowując, oto kilka przydatnych linków.
libportable
źródło
Przepraszamy za odniesienie zewnętrzne, ale myślę, że pasuje do twojego pytania:
Wskazówka C / C ++: Jak wykryć typ systemu operacyjnego za pomocą makr predefiniowanych przez kompilator
źródło
Możesz użyć,
Boost.Predef
który zawiera różne predefiniowane makra dla platformy docelowej, w tym OS (BOOST_OS_*
). Tak, zwiększenie jest często uważane za bibliotekę C ++, ale ta jest nagłówkiem preprocesora, który również działa z C!Na przykład
Pełna lista znajduje się w
BOOST_OS
makrach systemu operacyjnegoźródło
Nie znalazłem tutaj definicji Haiku . Podsumowując, definicja Haiku-os jest prosta
__HAIKU__
źródło
Niektóre kompilatory wygenerują # definicje, które mogą ci w tym pomóc. Przeczytaj dokumentację kompilatora, aby ustalić, jakie są. MSVC definiuje taki, który jest
__WIN32__
, GCC ma jedne widać ztouch foo.h; gcc -dM foo.h
źródło
Możesz użyć dyrektyw preprocesora jako ostrzeżenia lub błędu, aby sprawdzić w czasie kompilacji, że wcale nie musisz uruchamiać tego programu, po prostu go skompiluj .
źródło
Napisałem małą bibliotekę, aby uzyskać system operacyjny, na którym jesteś, można go zainstalować przy użyciu clib (menedżera pakietów C), więc bardzo łatwo jest używać go jako zależności dla twoich projektów.
zainstalować
Stosowanie
Zwraca string (
char*
) z nazwą używanego systemu operacyjnego, aby uzyskać więcej informacji na temat tego projektu, zapoznaj się z dokumentacją na Github .źródło