Warunkowo ukryj kod z kompilatora

Oto problem. Ustawiam wkrótce wydanie aktualizacji dla systemu iOS, która będzie rozwiązywać pewne problemy w systemie iOS 7. Aby to zrobić, muszę użyć niektórych specyficznych funkcji / typów iOS 7. Dałem absolutną pewność, że kod iOS 7 zostanie wykonany tylko na iOS 7 i powróci do innego kodu dla pre iOS 7. Oczywiście nie mogę przesyłać z obecną wersją beta Xcode, więc staram się skompilować z aktualną wersją Xcode. Nie mogę jednak znaleźć sposobu na wyłączenie tego szczególnego ostrzeżenia:

Use of undeclared identifier '<Redacted>'.

Czy ktoś wie, jak wyłączyć to ostrzeżenie za pomocą#pragma. Próbowałem kilka różnych, w tym

-w, -Weverthing, -Wall

ale nic nie działa.

AKTUALIZACJA Odpowiedź: Oczywiście nie możesz, ponieważ kompilator nie może skompilować identyfikatora, o którym nic nie wie. Moje rozwiązania polegały na stworzeniu#define:

#define <redacted> 1

AKTUALIZACJA 2 Odpowiedź poniżej znacznie ułatwiła. Już stworzyłem#define Xcode5Code(code, alt) co pozwoliło mi warunkowo wykonać bloki kodu. Modyfikując go za pomocą rozwiązania @maddy:

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

Pozwala mi to łatwo ukryć bloki kodu z kompilatora przy użyciu:

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

Główną zaletą korzystania z#define Xcode5Code jest to, że Xcode automatycznie go uzupełni, co jest o wiele łatwiejsze niż pełne#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000, który Xcode nie zostanie automatycznie uzupełniony.

Nie rozróżni to urządzeń z systemem iOS 7 i pre iOS 7. Rozróżnia tylko to, która wersja systemu iOS może obsługiwać bieżący Xcode. Aby odróżnić wersje urządzeń z systemem iOS:

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;
}

Nawiasem mówiąc, powyższy kod firmy Apple. Aby trochę zatańczyć wokół NDA, powiem, że pomaga to w ustawieniu widoku kontrolera głównego, ponieważ zależy to zarówno od wersji używanego Xcode, jak i wersji systemu iOS na urządzeniu. A jeśli próbujesz zarządzać kodem beta i kodem produkcyjnym, może to bardzo pomóc. Po przesłaniu aplikacji z kodem Xcode 5#define Xcode5Code nie będzie już konieczne.

questionAnswers(1)

yourAnswerToTheQuestion