Frage

Ich schreibe einen semi-portable Code und will erkennen können, wenn ich für iPhone bin kompilieren. Deshalb möchte ich so etwas wie #ifdef IPHONE_SDK....

Vermutlich Xcode definiert etwas, aber ich kann nichts unter Projekteigenschaften sehen, und Google ist nicht viel helfen.

War es hilfreich?

Lösung

Es ist in der SDK-Dokumentation unter „Quellcode kompilieren bedingt“

Die entsprechenden Definitionen sind TARGET_OS_IPHONE (und er veraltet TARGET_IPHONE_SIMULATOR), die in /usr/include/TargetConditionals.h im iOS Rahmen definiert sind. Bei früheren Versionen des Werkzeugkette, mußte man schreiben:

#include "TargetConditionals.h"

, aber das ist nicht mehr notwendig, auf der aktuellen (xCode 6 / iOS8) Toolchain.

So zum Beispiel, wenn Sie wollen, nur einen Block von Code kompilieren, wenn Sie für das Gerät bauen, dann sollten Sie tun,

#if !(TARGET_OS_SIMULATOR)
...
#endif

Andere Tipps

Um Blick auf alle definierten Makros, fügen Sie diese auf die „Andere C Flags“ des Build config:

-g3 -save-temps -dD

Sie erhalten einige Fehler bauen, aber der Compiler alle definiert in .mi Dateien in Ihrem Projekt Stammverzeichnis Dump. Sie können grep verwenden, sie zu betrachten, zum Beispiel:

grep define main.mi 

Wenn Sie fertig sind, vergessen Sie nicht, diese Optionen aus der Build-Einstellung zu entfernen.

Die Antworten auf diese Frage sind nicht ganz richtig. Die Frage der Plattform und Hardware vs Simulator ist orthogonal.

Nicht-Architektur als Abkürzung für Plattform oder Simulator Erkennung verwenden! Diese Art von schlampig Denken viele, viele Programmierer viel Sodbrennen und Kopfschmerzen im Laufe der Jahre verursacht hat.

Hier ist ein ASCII-Diagramm der conditionals. Die Namen müssen nicht Sinn aus historischen Gründen machen:

+--------------------------------------+
|             TARGET_OS_MAC            |
| +---+  +---------------------------+ |
| |   |  |      TARGET_OS_IPHONE     | |
| |OSX|  | +-----+ +----+ +-------+  | |
| |   |  | | IOS | | TV | | WATCH |  | |
| |   |  | +-----+ +----+ +-------+  | |
| +---+  +---------------------------+ |
+--------------------------------------+

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC gilt für alle Apple-Plattformen.


TARGET_OS_OSX gilt nur für Mac OS

TARGET_OS_IPHONE gilt für iOS, watchOS und tvOS (Geräte & Simulatoren)


TARGET_OS_IOS gilt nur für iOS (Geräte & Simulatoren)

TARGET_OS_WATCH gilt nur für watchOS (Geräte & Simulatoren)

TARGET_OS_TV gilt nur für tvOS (Geräte & Simulatoren)


TARGET_OS_EMBEDDED gilt nur für iOS / watchOS / tvOS Hardware

TARGET_OS_SIMULATOR gilt nur für den Simulator.


Ich werde auch beachten Sie, dass Sie die Einstellungen in xcconfig Dateien von Plattform konditionalisieren können:

//macOS only
SOME_SETTING[sdk=macosx] = ...

//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...

//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...

//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...

// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top