Code bedingt vor dem Compiler verbergen

Also hier ist das Problem. Ich werde demnächst ein Update für iOS veröffentlichen, mit dem einige Probleme in iOS 7 behoben werden. Dazu muss ich einige spezifische iOS 7-Funktionen / -Typen verwenden. Ich habe absolut sicher gestellt, dass iOS 7-Code nur unter iOS 7 ausgeführt wird und auf einen anderen Code für iOS 7 vor Version 7 zurückgegriffen werden kann. Natürlich darf ich mit der aktuellen Xcode-Beta keine Beiträge einreichen, daher versuche ich zu kompilieren mit der aktuellen Xcode-Version. Es scheint jedoch nicht möglich zu sein, diese Warnung zu deaktivieren:

Use of undeclared identifier '<Redacted>'.

Kennt jemand eine Möglichkeit, diese Warnung mit einem zu deaktivieren?#pragma. Ich habe eine Reihe von verschiedenen ausprobiert, darunter

-w, -Weverthing, -Wall

aber nichts scheint zu funktionieren.

AKTUALISIEREN Antwort: Dies ist natürlich nicht möglich, da der Compiler keine Kennung kompilieren kann, über die er nichts weiß. Meine Lösung bestand darin, einfach eine#define:

#define <redacted> 1

UPDATE 2 Die Antwort unten hat es tatsächlich viel einfacher gemacht. Ich hatte schon einen erstellt#define Xcode5Code(code, alt) das erlaubte mir, Codeblöcke bedingt auszuführen. Durch Modifizieren mit der Lösung von @maddy:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    #define Xcode5Code(code, alt) code
#else
    #define Xcode5Code(code, alt) alt
#endif

Auf diese Weise kann ich Codeblöcke auf einfache Weise vor dem Compiler verbergen, indem ich Folgendes verwende:

Xcode5Code({
    //Code to be execute only with Xcode 5
}, {
    //code to be executed in previous versions of Xcode
})

Der Hauptvorteil der Verwendung von#define Xcode5Code ist, dass Xcode es für Sie automatisch vervollständigt, was viel einfacher ist als die Verwendung des vollständigen Codes#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000, welcher Xcode nicht automatisch vervollständigt.

Dies unterscheidet nicht zwischen iOS 7- und Pre-iOS 7-Geräten. Es wird nur unterschieden, mit welcher iOS-Version der aktuelle Xcode umgehen kann. Um zwischen iOS-Geräteversionen zu unterscheiden, verwende ich:

NSUInteger DeviceSystemMajorVersion(void) {
    static NSUInteger _deviceSystemMajorVersion = -1;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue];
    });
    return _deviceSystemMajorVersion;
}

Das obige ist übrigens Apples Code. Um ein wenig über den NDA zu tanzen, möchte ich sagen, dass dies beim Erstellen der Ansicht eines Root-Controllers hilfreich ist, da dies sowohl von der verwendeten Xcode-Version als auch von der auf dem Gerät installierten iOS-Version abhängt. Und wenn Sie versuchen, sowohl den Beta-Code als auch den Produktionscode zu verwalten, kann dies sehr hilfreich sein. Sobald Sie mit Xcode 5 Apps einreichen können, wird der#define Xcode5Code wird nicht mehr notwendig sein.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage