Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 可以使用预处理器指令为Mac和iOS导入不同的头文件吗?_Objective C_C Preprocessor - Fatal编程技术网

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

Objective c 可以使用预处理器指令为Mac和iOS导入不同的头文件吗?,objective-c,c-preprocessor,Objective C,C Preprocessor,我正在为MacOSX和iOS编写一个类库,作为OSX的Cocoa框架和iOS的静态库发布。为了简化问题,我打算在Xcode中使用多个目标。但是,Mac OS X上的类与COCOA.H链接,而在iOS上,它们与Buff.H.链接。 我的问题基本上是: LI> Mac OS X框架能代替基础框架吗?框架中使用的类有NSString、NSMutableString和NSMutableArray 或者我可以在头文件中使用预处理器指令来控制框架包含,例如 #ifdef MacOSX #impo

我正在为MacOSX和iOS编写一个类库,作为OSX的Cocoa框架和iOS的静态库发布。为了简化问题,我打算在Xcode中使用多个目标。但是,Mac OS X上的类与COCOA.H链接,而在iOS上,它们与Buff.H.

链接。 我的问题基本上是:

    <> LI> Mac OS X框架能代替基础框架吗?框架中使用的类有NSString、NSMutableString和NSMutableArray
  • 或者我可以在头文件中使用预处理器指令来控制框架包含,例如

    #ifdef MacOSX
        #import <Cocoa/Cocoa.h>
    #else
        #import <Foundation/Foundation.h>
    #endif
    
    #ifdef MacOSX
    #进口
    #否则
    #进口
    #恩迪夫
    
    <> LI> Mac OS X框架能代替基础框架吗?框架中使用的类有NSString、NSMutableString和NSMutableArray
试试看。如果编译失败,则为否。如果编译成功,则为是

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

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

您可以使用它们来分离依赖于平台的代码(请参见
TargetConditionals.h
):

这里有一个。

它就像一个符咒:

#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

这对我来说非常有效:

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

我做了一些测试,并相应地修改了代码。显然,
TARGET\u OS\u MAC
也是为iOS定义的。最好是仔细研究一下
TargetConditionals.h
,看看哪些宏适合您的需要。有很多。我相信现在你需要使用
\if TARGET\u OS\u IPHONE
,而不是
\ifdef
。这个答案是错误的。有两个问题:首先,
TARGET\u OS\u IPHONE
将始终被定义。它有时被定义为0,但它仍然被定义。与目标IPHONE模拟器相同。但是,另外,
TARGET\u IPHONE\u SIMULATOR
永远不会为1,除非
TARGET\u OS\u IPHONE
也为1。如果您需要特别检查iOS模拟器,您应该首先进行检查,例如:
\If TARGET\u IPHONE\u simulator
/
\elif TARGET\u OS\u IPHONE
/
\elif TARGET\u OS\u MAC
/
\endif
。看看这个。谢谢。思考这个问题,基金会是一个框架,因此我认为不应该有问题。我去试试看!想想看,核心情节正是你想做的。如果你有问题,看看他们做了什么。我认为这是唯一的答案,实际上会工作。
#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED
//iOS 
#else
//Mac
#endif