С++ #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? Сейчас он не работает.
Спасибо!
Ответы
Ответ 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_ *.