可以使用预处理程序指令为Mac和iOS导入不同的头文件吗?

时间:2011-01-25 19:59:01

标签: objective-c c-preprocessor

我正在为Mac OS X和iOS编写一个类库,作为OS X的Cocoa Framework和iOS的静态库发布。为了简化问题,我打算在Xcode中使用多个目标。但是,Mac OS X上的类链接到Cocoa.h,而在iOS上它们链接到Foundation.h。

我的问题基本上是:

  • Mac OS X框架可以链接到Foundation.framework吗?框架中使用的类是NSString,NSMutableString和NSMutableArray。
  • 或者我可以在头文件中使用预处理器指令来控制框架包含,例如。

    #ifdef MacOSX
        #import <Cocoa/Cocoa.h>
    #else
        #import <Foundation/Foundation.h>
    #endif
    

4 个答案:

答案 0 :(得分:21)

您可以使用这些来分隔平台相关代码(请参阅TargetConditionals.h):

#ifdef TARGET_OS_IPHONE 
    // iOS
#elif defined TARGET_IPHONE_SIMULATOR
    // iOS Simulator
#elif defined TARGET_OS_MAC
    // Other kinds of Mac OS
#else
    // Unsupported platform
#endif

这是useful chart

答案 1 :(得分:8)

它就像一个魅力:

#ifdef __APPLE__
  #include "TargetConditionals.h"

  #if TARGET_IPHONE_SIMULATOR  
  // ios simulator

  #elif TARGET_OS_IPHONE
  // ios device

  #elif TARGET_OS_MAC
  // mac os 

  #else
  // Unsupported platform
  #endif
#endif

答案 2 :(得分:2)

  
      
  • Mac OS X框架可以链接到Foundation.framework吗?框架中使用的类是NSString,NSMutableString和NSMutableArray。
  •   

试一试,看看。如果编译失败,没有。如果成功,是的。

  
      
  • 或者我可以在头文件中使用预处理器指令来控制框架包含,例如
  •   

是的,你可以。事实上,我认为这是唯一的方式。

答案 3 :(得分:1)

这对我很有用:

#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED
//iOS 
#else
//Mac
#endif