2011-07-23 14 views
33

Jestem całkiem nowy w C++. Obecnie pracuję nad projektem grupowym i chcemy, aby nasze klasy były kompatybilne zarówno z komputerami laboratoryjnymi (Windows) i moim komputerem (Mac OS X).C++ #ifdef Pytanie Mac OS X

Oto co zostało umieszczenie na szczycie naszych plików:

#ifdef TARGET_OS_X 
# include <GLUT/glut.h> 
# include <OpenGL/OpenGL.h> 
#elif defined _WIN32 || defined _WIN64 
# include <GL\glut.h> 
#endif 

I realizować to pytanie zostało zadane wcześniej, ale moje pytania zostały dając mi sprzecznych odpowiedzi takie jak „_MAC”, „TARGET_MAC_OS "," MACINTOSH "itp. Jaka jest aktualna i prawidłowa deklaracja, aby umieścić w instrukcji #ifdef, aby była kompatybilna z Mac? W tej chwili nie działa.

Dziękujemy!

Odpowiedz

32

Według this answer:

#ifdef __APPLE__ 
    #include "TargetConditionals.h" 
    #ifdef TARGET_OS_IPHONE 
     // iOS 
    #elif TARGET_IPHONE_SIMULATOR 
     // iOS Simulator 
    #elif TARGET_OS_MAC 
     // Other kinds of Mac OS 
    #else 
     // Unsupported platform 
    #endif 
#endif 

Tak w skrócie:

#ifdef __APPLE__ 
    #include "TargetConditionals.h" 
    #ifdef TARGET_OS_MAC 
     #include <GLUT/glut.h> 
     #include <OpenGL/OpenGL.h> 
    #endif 
#elif defined _WIN32 || defined _WIN64 
    #include <GL\glut.h> 
#endif 
+1

Oczywiście, '#ifdef __APPLE__' będzie wystarczające, jeśli OP nie jest kierowany na iOS. –

+1

@ larsmans: Lepiej już teraz przepraszam. Jeśli użytkownik zdecyduje się uprościć, to na pewno :) – orlp

+4

Definicja 'TARGET_OS_IPHONE' jest zdefiniowana dla Symulatora iOS, dlatego musisz przed nią wykonać test" TARGET_IPHONE_SIMULATOR ". * Również *, wszystkie trzy są zdefiniowane na platformach Apple'a - musisz przetestować pod względem wartości ('#if TARGET_OS_IPHOST' zamiast' #ifdef TARGET_OS_IPHONE'.) –

11

To zależy od kompilatora. #ifdef __APPLE__ działa dla gcc.

1

Według firmy Microsoft numer _WIN32 dotyczy zarówno 32-bitowej, jak i 64-bitowej wersji systemu Windows. I __APPLE__ działa dla Clang (przynajmniej w Mavericks). Więc jeden poprawny sposób pisać ifdefs powyżej jest:

#ifdef __APPLE__ 
    DoSomething(); 
#elif _WIN32 
    DoSomethingElse(); 
#else 
    GenerateErrorOrIgnore 
1

Mała korekta: #ifdef TARGET_OS_MAC będzie Ci zawsze prawdziwe zarówno na OS X i iOS, jak to określa wartość 0 lub 1 w zależności od platformy, ale kiedy APPLE jest zdefiniowany, TARGET_OS_MAC jest również zdefiniowany, więc sprawdzenie go wewnątrz #ifdef APPLE jest bezwartościowe. Zamiast tego możesz użyć #if TARGET_OS_MAC. To samo dotyczy wszystkich makr TARGET_ *.