【问题标题】:c++ #ifdef Mac OS X questionc++ #ifdef Mac OS X 问题
【发布时间】:2011-10-11 18:53:33
【问题描述】:

我对 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 兼容?现在它不工作。

谢谢!

【问题讨论】:

    标签: c++ macos compatibility conditional-compilation


    【解决方案1】:

    小修正:#ifdef TARGET_OS_MAC 将在 OS X 和 iOS 上始终为真,因为它根据平台定义 0 或 1,但是当定义 APPLE 时,TARGET_OS_MAC 被定义为好吧,所以在 #ifdef APPLE 中检查它是没有价值的。 您可能想改用#if TARGET_OS_MAC。所有 TARGET_* 宏都相同。

    【讨论】:

      【解决方案2】:

      根据 Microsoft 的说法,_WIN32 将涵盖 32 位和 64 位版本的 Windows。 __APPLE__ 为 Clang 工作(至少在小牛队)。因此,编写上述 ifdef 的一种正确方法是:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 当然,如果 OP 不针对 iOS,#ifdef __APPLE__ 就足够了。
          • @larsmans:最好先确定然后再抱歉。如果用户决定简化,当然:)
          • TARGET_OS_IPHONE 是为 iOS 模拟器定义的,因此您需要将 TARGET_IPHONE_SIMULATOR 测试放在它之前。 另外,这三个都是在 Apple 平台上定义的——你必须按值测试(#if TARGET_OS_IPHONE 而不是#ifdef TARGET_OS_IPHONE。)
          • 另外,TARGET_OS_MAC 在 iPhone 上是 1,所以如果要区分 Mac 和 iPhone,请先测试 iPhone。
          • #ifdef 对于分配了 0 的定义?只需查看 TargetConditionals.h:对于 APPLE,我们同时定义了 IPHONE 和 MAC。那是误导。我所做的是:#ifdef __APPLE__ #include "TargetConditionals.h" #if(TARGET_OS_MAC) #define RUNNING_ON_MAC #endif #endif
          猜你喜欢
          • 1970-01-01
          • 2013-05-15
          • 2011-08-15
          • 2011-08-19
          • 2012-08-15
          • 2016-09-26
          • 1970-01-01
          相关资源
          最近更新 更多