2012-08-26 77 views
4

我有一個同時擁有iOS和OS X目標的項目。當我編譯OS X時,是否有預處理宏?我試過這個:OS X目標的預處理宏?

#if TARGET_OS_MAC 
@interface BFNode : NSObject <NSPasteboardReading, NSPasteboardWriting> { 
#else 
@interface BFNode : NSObject { 
#endif 

但是TARGET_OS_MAC似乎不起作用。當我嘗試在iOS上運行應用程序時,出現編譯器錯誤,因爲它嘗試編譯第一行,並且在iOS上沒有定義NSPasteboardReading協議。我知道TARGET_OS_IPHONE也是。如果我使用它並交換@interface聲明它的工作。

但有很多地方我有代碼,沒有iOS版本,所以我需要一個OS X的宏。

SOLUTION:

我結束了在.PCH文件中定義一個新的宏:

#define TARGET_OSX TARGET_OS_IPHONE == 0 

回答

2

查找範圍TargetConditionals.h的完整列表,其中包括:

#define TARGET_OS_MAC    1 
#define TARGET_OS_IPHONE   1 
#define TARGET_IPHONE_SIMULATOR  1 
+0

你似乎已經得到了錯誤的方式。實際上,TARGET_OS_MAC是在爲iOS構建時定義的。 – Till

1

我會建議使用此:

#define TARGET_OS_OSX (!(TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH)) 
5

如果您在使用雨燕,還有爲這個偉大language feature。如果您使用的Objective-C,它往往是有用的做這樣的事情:

#include <TargetConditionals.h> 

#if TARGET_OS_IPHONE 
    @import UIKit; 
#else 
    @import AppKit; 
#endif 

瞭解TARGET_OS_*定義將使這使很多更有意義。最值得注意的是,TARGET_OS_MAC是任何意想不到的蘋果平臺。 !TARGET_OS_IPHONE是macOS和TARGET_OS_IPHONE是除此之外的任何東西。 iOS,tvOS和watchOS有更多具體的定義。

TargetConditions.h

TARGET_OS_* 
These conditionals specify in which Operating System the generated code will 
run. Indention is used to show which conditionals are evolutionary subclasses. 

The MAC/WIN32/UNIX conditionals are mutually exclusive. 
The IOS/TV/WATCH conditionals are mutually exclusive. 


    TARGET_OS_WIN32   - Generated code will run under 32-bit Windows 
    TARGET_OS_UNIX   - Generated code will run under some Unix (not OSX) 
    TARGET_OS_MAC    - Generated code will run under Mac OS X variant 
     TARGET_OS_IPHONE   - Generated code for firmware, devices, or simulator 
      TARGET_OS_IOS    - Generated code will run under iOS 
      TARGET_OS_TV    - Generated code will run under Apple TV OS 
      TARGET_OS_WATCH   - Generated code will run under Apple Watch OS 
     TARGET_OS_SIMULATOR  - Generated code will run under a simulator 
     TARGET_OS_EMBEDDED  - Generated code for firmware 

    TARGET_IPHONE_SIMULATOR - DEPRECATED: Same as TARGET_OS_SIMULATOR 
    TARGET_OS_NANO   - DEPRECATED: Same as TARGET_OS_WATCH 
1

作爲Xcode的8 GM的,這是在IOS 10.0的相關部分TargetConditionals.h

#define TARGET_OS_MAC    1 
#define TARGET_OS_WIN32    0 
#define TARGET_OS_UNIX    0 
#define TARGET_OS_OSX    0 
#define TARGET_OS_IPHONE   1 
#define TARGET_OS_IOS    1 
#define TARGET_OS_WATCH    0 
#define TARGET_OS_BRIDGE   0 
#define TARGET_OS_TV    0 
#define TARGET_OS_SIMULATOR   0 
#define TARGET_OS_EMBEDDED   1 
#define TARGET_IPHONE_SIMULATOR  TARGET_OS_SIMULATOR /* deprecated */ 
#define TARGET_OS_NANO    TARGET_OS_WATCH /* deprecated */ 

(在上述的 '麪包屑'文本編輯器在Xcode,iOS 10.0 > usr/include > TargetConditionals.h

...這是同一個文件,適用於MacOS:

#define TARGET_OS_MAC    1 
#define TARGET_OS_WIN32    0 
#define TARGET_OS_UNIX    0 
#define TARGET_OS_OSX    1 
#define TARGET_OS_IPHONE   0 
#define TARGET_OS_IOS    0 
#define TARGET_OS_WATCH    0 
#define TARGET_OS_BRIDGE   0 
#define TARGET_OS_TV    0 
#define TARGET_OS_SIMULATOR   0 
#define TARGET_OS_EMBEDDED   0 
#define TARGET_IPHONE_SIMULATOR  TARGET_OS_SIMULATOR /* deprecated */ 
#define TARGET_OS_NANO    TARGET_OS_WATCH /* deprecated */ 

(在Xcode中的文本編輯器上方的 '麪包屑',macOS 10.12 > usr/include > TargetConditionals.h

TARGET_OS_MAC被定義爲這兩個平臺上,但TARGET_OS_OSX是隻在macOS上。

在文件的意見,他們的描述如下:

  • TARGET_OS_MAC:生成的代碼將在Mac OS X上運行的變體。
  • TARGET_OS_OSX:生成的代碼將在OS X設備下運行。

我在某些時候想當年(也許是圍繞着iPhone宣佈何時?)有人決定的iOS(NE「iPhone OS」)符合「Mac OS X的變種」的定義。

+0

我記得史蒂夫喬布斯在舞臺上提到,早在2007年,當他宣佈iPhone,「它運行Mac OS X」。 –