c ++ #ifdef Mac OS X问题

时间:2011-07-23 19:49:38

标签: c++ macos compatibility conditional-compilation

我是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 个答案:

答案 0 :(得分:34)

根据this answer

#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 

答案 1 :(得分:11)

这取决于编译器。 #ifdef __APPLE__适用于gcc。

答案 2 :(得分:4)

小修正:#ifdef TARGET_OS_MAC将在OS X和iOS上始终保持正确,因为它根据平台定义为0或1,但是当定义 APPLE 时,TARGET_OS_MAC定义为那么,在#ifdef APPLE 中查看它是没有价值的。 您可能希望使用#if TARGET_OS_MAC。所有TARGET_ *宏都相同。

答案 3 :(得分:2)

据微软称,_WIN32将涵盖32位和64位版本的Windows。 __APPLE__适用于Clang(至少在小牛队)。因此,编写上述ifdef的一种正确方法是:

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