2011-07-23 114 views
33

我对C++相当陌生。我目前正在开展一个小组项目,我们希望使我们的课程与实验室电脑(Windows)和我的电脑(Mac OS X)兼容。C++ #ifdef 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“等等。为了与Mac兼容,在#ifdef语句中放入了什么是当前正确的声明?现在它不工作。

谢谢!

回答

32

根据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

当然,如果OP不针对iOS,那么'#ifdef __APPLE__'就足够了。 –

+1

@larsmans:最好确定,然后抱歉。如果用户决定简化,当然:) – orlp

+4

'TARGET_OS_IPHONE'是为iOS模拟器定义的,因此您需要在它之前放置'TARGET_IPHONE_SIMULATOR'测试。 *还有*,这三个都是在苹果平台上定义的 - 您必须按值测试('#if TARGET_OS_IPHONE',而不是'#ifdef TARGET_OS_IPHONE'。) –

11

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

1

根据微软的说法,_WIN32将涵盖32位和64位版本的Windows。并且__APPLE__适用于Clang(至少在小牛队)。所以,写上面的ifdef一个正确的方法是:

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

小的修正:#ifdef来TARGET_OS_MAC将让你始终在OS X和iOS的真正的,因为它定义为0或1,具体取决于平台,但是当APPLE被定义了,TARGET_OS_MAC也被定义了,因此在#ifdef APPLE中检查它是毫无价值的。 您可能希望使用#if TARGET_OS_MAC。所有TARGET_ *宏都是相同的。