c ++ #ifdef Mac OS X вопрос - PullRequest
       11

c ++ #ifdef Mac OS X вопрос

34 голосов
/ 23 июля 2011

Я довольно новичок в C ++. В настоящее время я работаю над групповым проектом, и мы хотим, чтобы наши классы были совместимы как с лабораторными компьютерами (Windows), так и с моим компьютером (Mac OS X).

Вот что мы помещаем вверху наших файлов:

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

Я понимаю, что этот вопрос задавался ранее, но мои поиски давали мне противоречивые ответы, такие как "_MAC", "TARGET_MAC_OS", "MACINTOSH" и т. Д. Какое текущее и правильное объявление нужно добавить в оператор #ifdef сделать это совместимым с Mac? Прямо сейчас это не работает.

Спасибо!

Ответы [ 4 ]

34 голосов
/ 23 июля 2011

Согласно этот ответ :

#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

Короче говоря:

#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 
11 голосов
/ 23 июля 2011

Это зависит от компилятора. #ifdef __APPLE__ работает для gcc.

4 голосов
/ 01 февраля 2015

Небольшое исправление: #ifdef TARGET_OS_MAC даст вам всегда истину как в OS X, так и в iOS, поскольку она определяет 0 или 1 в зависимости от платформы, но когда определено APPLE , также определен TARGET_OS_MACпоэтому проверка его внутри #ifdef APPLE бесполезна.Вы можете вместо этого использовать #if TARGET_OS_MAC.То же самое для всех макросов TARGET_ *.

2 голосов
/ 01 августа 2014

По данным Microsoft, _WIN32 будет охватывать как 32-битные, так и 64-битные версии Windows. И &#95;&#95;APPLE&#95;&#95; работает для Clang (по крайней мере, в Mavericks). Таким образом, один правильный способ написать приведенные выше ifdefs:

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