如何在目标c中使用预处理器

时间:2013-10-01 06:21:48

标签: ios preprocessor

嗨,在我的一个应用程序中,我必须支持IOS6的应用程序。 IOS7。为了实现这一点,我必须知道当前的设备版本。为此,我定义了一个宏,我正在尝试使用该宏作为完成我的任务的参考。我写的代码如下所示。

在.h文件中,我将IPhoneOSVersion定义为50000。

此代码位于.m文件

if([[[UIDevice currentDevice] systemVersion] isEqualToString:@"7.0"])
    {

      #undef IPhoneOSVersion
      #define IPhoneOSVersion 70000

        NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion);
    }
    else 
    {

          #undef IPhoneOSVersion
          #define IPhoneOSVersion 60000

        NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion);
    }

NSLog(@"_IPHONE_OS_VERSION_MIN_REQUIRED after is %d",IPhoneOSVersion);

如果我在IOS7中运行此代码。在控制台中,数据必须在70000之后打印_IPHONE_OS_VERSION_MIN_REQUIRED,但不幸的是我在60000之后得到_IPHONE_OS_VERSION_MIN_REQUIRED。即使我在其他条件下也设置了断点但是没有执行但宏值正在改变。任何人都可以让我知道为什么宏值会像这样改变。

3 个答案:

答案 0 :(得分:1)

你不应该对操作系统版本进行硬编码,Apple推荐的支持多个操作系统版本的方法是检查某些特定的类,API,协议或功能,这样可以提供更大的灵活性,因为其中一些东西有时是向后兼容的

这是一个非常不错的教程,介绍如何检查代码http://www.raywenderlich.com/42591/supporting-multiple-ios-versions-and-devices中的特定资源是否存在以及来自Apple https://developer.apple.com/library/ios/documentation/developertools/conceptual/cross_development/Using/using.html的文档

编辑:为了回答关于为什么宏被更改的问题,编译器遍历if-else的两个分支,因此使用宏的最后一个声明。您不能使用这样的宏并在运行时更改它,宏应在编译之前定义。

答案 1 :(得分:0)

您可以使用Objective-C中的预处理器,其方式与C或C ++完全相同。预处理器不关心你的if / else语句。它看到#undef,#define,#undef,#define的序列并一个接一个地执行它们,所以在你的最后一行中,最后一个#define生效。您无法使用运行时发生的任何事情来影响这些#defines。

总有三种操作系统版本:部署目标(即允许运行应用程序的最低操作系统版本),SDK版本以及运行时的实际版本。你在Xcode中设置的前两个;实际版本显然是您无法控制的,除非您知道它与部署目标相同或更高。

__ IPHONE_OS_VERSION_MIN_REQUIRED =部署目标 __IPHONE_OS_VERSION_MAX_ALLOWED = SDK版本

答案 2 :(得分:-1)

尝试

if([[[UIDevice currentDevice] systemVersion] floatValue] == 7.0)