【问题标题】:how to check if condition in preprocessor macro? [duplicate]如何检查预处理器宏中的条件? [复制]
【发布时间】:2012-12-31 05:57:53
【问题描述】:

可能重复:
How to import Social framework only for iOS 6?

需要检查预处理器宏中的条件。

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */



if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0"))
{
#import <Social/SLServiceTypes.h>
#import <Social/SLRequest.h>
#import <Social/Social.h>
#import <Social/SocialDefines.h>
}

【问题讨论】:

  • 另外,不要测试 iOS 版本/设备类型,不要猜测,检查功能。

标签: iphone ios macros


【解决方案1】:

如前所述,#import 是一个编译时指令——所有预处理器指令(以# 开头的东西)都是。因此,您似乎在这里尝试做的事情不会像您期望的那样工作。

只要您只使用最新的 SDK 进行构建,您就不需要有条件地使用 #import 标头 - 无论您要构建的目标 iOS 版本是什么,您都可以使用最新的标头。

如果您的代码需要在不同的 SDK 版本下构建——例如如果你有一个队友的机器不能运行最新的 Xcode,那就是条件导入的时候了。但由于这是编译时的事情,您需要针对您的 SDK 版本进行编译时检查,而不是运行时检查。使用类似的东西:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
// building with iOS 6 SDK, safe to import Social framework
#endif

不过,如果您希望自己的代码构建使用较旧的 SDK,您只需要这样做。

如果您希望您的应用在较旧的 iOS 版本上运行,但又希望有条件地使用新的 iOS 功能,那么您就需要运行时检查。您还需要使用weak linking。然而,即便如此,Apple 还是建议您避免检查版本号——最好检查您需要的特定功能。比如你想使用Social框架,弱链接整个框架(i.e. make it Optional),然后在使用前检查你想要的类是否存在:

if ([SLComposeViewController class] {
    SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    // ...
}

为什么要避免版本号检查?好吧,假设您在尝试使用社交框架 API 之前检查了高于 5.1 的 iOS 版本……然后假设 Apple 发布了另一个 5.1.x 更新以修复安全漏洞。现在,您的应用程序认为它在具有社交框架的版本上,尝试使用它,崩溃并在 App Store 上给您差评。如果您检查 6.0 会怎样……那么 Apple 可能会改变他们对轴系原始 iPad 用户的想法并发布 5.x 更新,至少让我们拥有一些 iOS6 功能,包括社交?现在您的应用不会崩溃,但它也不会让您的用户拥有新的 iOS 功能——再次获得一星评价。

【讨论】:

    【解决方案2】:

    您不能在运行时导入文件。 imports 在编译时工作。 由于上述宏正在使用将在运行时计算值的方法,所以我认为您想要实现的任何目标都是不可能的

    【讨论】:

      【解决方案3】:

      结构非常简单:#IF ... #ENDIF

      以下是一些有用的链接: First, Second, Third

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多