有条件地隐藏编译器的代码

所以这是问题。 我准备尽快为iOS发布更新,以解决iOS 7中的一些问题。为此,我需要使用一些特定的iOS 7function/types。 我已经绝对确定,iOS 7的代码只能在iOS 7上执行,并在iOS 7之前回退到不同的代码。当然,我不允许使用当前的Xcodetesting版进行提交,所以我试图编译与当前的Xcode版本。 但是,我似乎无法find一种方法来禁用此特定的警告:

Use of undeclared identifier '<Redacted>'.

有谁知道使用#pragma禁用此警告的方法。 我已经尝试了一堆不同的包括

-w-Weverthing-Wall

但似乎没有任何工作。

更新答案:当然,你不能,因为编译器不能编译一个它一无所知的标识符。 我的解决scheme是简单地创build一个#define

#define <redacted> 1

更新2下面的答案实际上使得它更容易。 我已经创build了一个#define Xcode5Code(code, alt) ,它允许我有条件地执行代码块。 通过使用@maddy的解决scheme修改它:

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

这使我可以通过使用以下方法轻松地从编译器隐藏代码块:

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

使用#define Xcode5Code的主要好处是Xcode会为你自动完成,这比使用完整的#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000更容易,Xcode不会自动完成。

这实际上不会区分iOS 7和iOS 7之前的设备。 它只区分当前Xcode可以处理的iOS版本。 区分我使用的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; } 

以上是苹果的代码,顺便说一下。 为了在NDA上跳舞,我会说这有助于展示根控制器的视图,因为这取决于您使用的Xcode版本和设备上的iOS版本。 如果你试图pipe理testing版和生产代码,这可以帮助很多。 一旦您可以使用Xcode 5提交应用程序,则#define Xcode5Code将不再是必需的。

如果您想用两个不同版本的Xcode或两个不同的Base SDK设置来编译您的应用程序,那么您应该使用编译器指令:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // iOS 7.0 supported // iOS 7 code here #else // Pre-iOS 7 code here #endif 

不要将其用于运行时检查。 只有在您必须使用两个不同的版本编译代码时,才能使用此解决scheme。 一个例子是你已经添加了iOS 7的代码,但你仍然需要用Xcode 4.6编译代码。 使用编译指令可以让你使用旧的Base SDK从编译器“隐藏”iOS 7代码。

请参阅文档中的“SDK兼容性指南”以获取更多有关此正确运行时检查的信息。