17

iOS と OS X の両方のターゲットを持つプロジェクトがあります。OS X 用にコンパイルするときに真のプリプロセッサ マクロはありますか? 私はこれを試しました:

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

しかし、TARGET_OS_MACうまくいかないようです。iOS でアプリを実行しようとすると、コンパイラ エラーが発生します。これは、最初の行をコンパイルしようとし、NSPasteboardReadingiOS で定義されたプロトコルがないためです。

私もあると知っていTARGET_OS_IPHONEます。@interfaceそれを使用して宣言を交換すると、機能します。

しかし、iOS バージョンのないコードがある場所がたくさんあるので、OS X 用のマクロも必要です。

解決:

.pch ファイルに新しいマクロを定義することになりました。

#define TARGET_OSX TARGET_OS_IPHONE == 0
4

7 に答える 7

13

Swift を使用している場合、これには優れた言語機能があります。Objective-C を使用している場合、次のようにすると便利なことがよくあります。

#include <TargetConditionals.h>

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

定義を理解するTARGET_OS_*と、これがより意味のあるものになります。最も注目すべきTARGET_OS_MACは、かなり予想外の Apple プラットフォームです。!TARGET_OS_IPHONEmacOSであり、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
于 2016-06-17T22:27:32.470 に答える
8

これはTARGET_OS_MAC、iOS 向けのビルド時にも定義されているためです。

その上でhttp://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.htmlを参照してください。

ターゲットのビルド設定を介して、独自のターゲット固有の定義を作成しようとします。

于 2012-08-26T19:01:29.707 に答える
4

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は両方のプラットフォームで1として定義されていますが、 macOS でのみ1TARGET_OS_OSXです。

ファイルのコメントでは、次のように説明されています。

  • TARGET_OS_MAC: 生成されたコードは、Mac OS X バリアントで実行されます。
  • TARGET_OS_OSX: 生成されたコードは OS X デバイスで実行されます。

当時のある時点で (おそらく iPhone が発表された頃でしょうか?)、誰かが iOS (旧称「iPhone OS」) が「Mac OS X バリアント」の定義に適合すると判断したと思います。

于 2016-09-12T03:11:24.137 に答える
3

以下を含む完全なリストについては、TargetConditionals.h を参照してください。

#define TARGET_OS_MAC               1
#define TARGET_OS_IPHONE            1 
#define TARGET_IPHONE_SIMULATOR     1 
于 2012-08-26T19:01:17.710 に答える
0

これを使用することをお勧めします:

#define TARGET_OS_OSX (!(TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH))
于 2016-01-21T09:26:27.337 に答える