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

BWH*_*zel 8 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
    
    Run Code Online (Sandbox Code Playgroud)

det*_*zed 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
Run Code Online (Sandbox Code Playgroud)

这是一张有用的图表.

  • 我做了一些测试并相应地更正了代码.显然,TARGET_OS_MAC也是为iOS定义的.最好是查看`TargetConditionals.h`并查看哪些宏适合您的需求.其中有不少. (3认同)
  • 这个答案是对的.有几个问题:首先,将始终定义`TARGET_OS_IPHONE`.它有时被定义为0,但它仍然被定义.与`TARGET_IPHONE_SIMULATOR`相同.但是,除非`TARGET_OS_IPHONE`也是1,否则`TARGET_IPHONE_SIMULATOR`永远不会是1.如果你需要专门检查iOS模拟器,你应该先检查一下,如:`#if TARGET_IPHONE_SIMULATOR` /`#elif TARGET_OS_IPHONE` /`#elif TARGET_OS_MAC` /`#endif`. (3认同)

小智 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
Run Code Online (Sandbox Code Playgroud)