Подтвердить что ты не робот

С++ #ifdef Вопрос Mac OS X

Я новичок в С++. В настоящее время я работаю над групповым проектом, и мы хотим, чтобы наши классы совместимы как с лабораторными компьютерами (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? Сейчас он не работает.

Спасибо!

4b9b3361

Ответ 1

В соответствии с этим ответом:

#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 

Ответ 2

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

Ответ 3

Согласно Microsoft, _WIN32 будет охватывать как 32-битную, так и 64-разрядную версии Windows. И __APPLE__ работает для Clang (по крайней мере, в Mavericks). Итак, один правильный способ написать ifdefs выше:

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

Ответ 4

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