web-dev-qa-db-fra.com

c ++ #ifdef Mac OS X question

Je suis assez nouveau en C++. Je travaille actuellement sur un projet de groupe et nous voulons rendre nos cours compatibles avec les ordinateurs du laboratoire (Windows) et mon ordinateur (Mac OS X).

Voici ce que nous avons mis en haut de nos fichiers:

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

Je réalise que cette question a déjà été posée mais mes recherches m'ont donné des réponses contradictoires telles que "_MAC", "TARGET_MAC_OS", "Macintosh", etc. Quelle est la déclaration actuelle et correcte à mettre dans l'instruction #ifdef pour faire ceci compatible avec Mac? Pour l'instant, cela ne fonctionne pas.

Je vous remercie!

34
Kirsty

Selon cette réponse :

#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

Bref:

#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 
33
orlp

Cela dépend du compilateur. #ifdef __Apple__ fonctionne pour gcc.

11
koan

Petite correction: #ifdef TARGET_OS_MAC vous obtiendra toujours vrai sur OS X et iOS, car il définit soit 0 soit 1 selon la plate-forme, mais lorsque Apple est défini, TARGET_OS_MAC est également défini, donc le vérifier à l'intérieur du #ifdef Apple ne vaut rien. Vous souhaiterez peut-être utiliser #if TARGET_OS_MAC à la place. Idem pour toutes les macros TARGET_ *.

4
Respiro

Selon Microsoft, _WIN32 couvrira les versions 32 bits et 64 bits de Windows. Et __Apple__ fonctionne pour Clang (au moins dans Mavericks). Donc, une bonne façon d'écrire les ifdefs ci-dessus est:

#ifdef __Apple__
    DoSomething();
#Elif _WIN32
    DoSomethingElse();
#else
    GenerateErrorOrIgnore
2
Jon Spencer