Вопрос по compatibility, macos, conditional-compilation, c++ –  работает для Clang (по крайней мере, в Mavericks). Таким образом, один правильный способ написать приведенные выше ifdefs:

34

ольно новичок в 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   ответа
4

#ifdef TARGET_OS_MAC даст вам всегда истину как в OS X, так и в iOS, так как он определяет 0 или 1 в зависимости от платформы, но когдаЯБЛОКО определен, TARGET_OS_MAC также определен, поэтому проверяем его внутри #ifdefЯБЛОКО ничего не стоит. Вы можете вместо этого использовать #if TARGET_OS_MAC. То же самое для всех макросов TARGET_ *.

2

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

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

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

#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 
Конечно,#ifdef __APPLE__ было бы достаточно, если бы ОП не предназначалась для iOS. Fred Foo
TARGET_OS_IPHONE определено для симулятора iOS, поэтому вам нужно поставитьTARGET_IPHONE_SIMULATOR тест перед этим.Такжевсе три определены на платформах Apple - вы должны проверить по значению (#if TARGET_OS_IPHONE скорее, чем#ifdef TARGET_OS_IPHONE.) Jonathan Grynspan
@larsmans: Лучше быть уверенным, потом извини. Если пользователь решает упростить, обязательно :) orlp
#ifdef для определения с присвоенным 0? Просто посмотрите на TargetConditionals.h: для APPLE мы определили IPHONE и MAC. Это вводит в заблуждение. Что я делаю это:#ifdef __APPLE__ #include "TargetConditionals.h" #if(TARGET_OS_MAC) #define RUNNING_ON_MAC #endif #endif Alexander V
Также,TARGET_OS_MAC на iPhone - 1, поэтому, если вы хотите различать Mac и iPhone, сначала проверьте iPhone. Jakob Egger
11

#ifdef __APPLE__ работает для gcc.

Похожие вопросы