版本判别,宏定义使用

来源:互联网 发布:重庆黑马程序员地址 编辑:程序博客网 时间:2024/06/06 19:01

先丢出一个炸弹:

#define kCurrentVersion [[[UIDevice currentDevice] systemVersion] intValue]#if  kCurrentVersion >= 9#endif

问题:invalid token at start of a preprocessor expression
大概意思:#if 的符号在预处理时无效

原因分析:
kCurrentVersion这个宏定义,要等到代码运行才会得到版本号,而#if属于条件编译,是在预处理阶段进行的。在预编译阶段,代码并未运行,无法获取到设备版本号,而导致在条件编译中kCurrentVersion并不是一个常量而出现问题。

解决方式:在条件编译中不使用代码运行时才生成的量即可。
如:

#define kCurrentVersion 9

基础分析

编译、连接、运行 定义描述

  • 编译:就是将C源程序翻译成计算机能识别的0 1 编译成功后会生成.o目标文件
  • 连接:将.o文件和C语言函数库组合在一起,生成可执行文件。连接成功可生成.out可执行文件。
  • 运行: 双击.out或用./*.out执行

而预编译则是在编译之前就进行的一系列处理。将一些量用某些符号替代,待预预编译结束后所有的符号都将换成所需要的量。 其意义是常量。所以不能在预编译中添加变量,因为在预编译时机变量还不存在。

预处理定义:

最常见的预处理是C语言和C++ygyy.ISO C和ISO C++都规定程序由源代码被翻译为若干有序的阶段(phase),通常前几个阶段由预处理器实现。预处理中会展开以#开始的行,试图解释为预处理指令(preprocessing directive),其中ISO C/C++要求支持的包括#if/#ifdef/#else/#elif/#ifndef/#endif(条件编译)、#defind(宏定义)、#include(源文件包含)、#inline(行控制)、#error(错误指令)、#pragma(和实现相关的杂注)以及单独的#(空指令)。预处理指令一般被用来使源代码在不同的执行环境中被方便的修改或者编译。 预处理(不)是预编译【摘自百科,有矛盾】

例子分析:#define与const区别点

  • define 常量则是一个Compile-Time概念,它的生命周期止于编译期
    在实际程序中他只是一个常数,一个命令中的参数,没有实际的存在。

  • const在堆栈分配了空间,const的常量是一个run-Time概念,它在程序中确实存在可以被调用,传递。

  • const 常量有数据类型,而宏常量没有数据类型。编译器可以对const常量进行类型安全检查。
  • define只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

条件编译在iOS中的一角

  1. 判断当前app所支持的iOS版本
#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED // 当前软件支持的最小版本ios版本#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000  // 最小支持的target      NSLog(@"当前app支持的最大版本,%d",__IPHONE_OS_VERSION_MAX_ALLOWED);#else      NSLog(@"当前app支持的最大版本,%d",__IPHONE_OS_VERSION_MAX_ALLOWED);#endif#endif#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80400      NSLog(@"当前app支持的最小版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);#else     NSLog(@"当前app支持的最小版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);#endif#endif
  1. 判断真机/模拟器
#if TARGET_OS_IOS    NSLog(@"真机测试");#endif#if TARGET_IPHONE_SIMULATOR    NSLog(@"模拟器");#endif
  1. 判断当前iOS版本
#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)
  1. 判断是否使用了ARC
#if ! __has_feature(objc_arc)    [super dealloc];#endif

参考:
编译基础
gcc预处理语句
const定义的常量与宏定义的区别:http://zhidao.baidu.com/question/158271828.html?qbl=relate_question_1&word=%B8%B3%D6%B5%B5%C4%BA%EA%D3%EB%B6%A8%D2%E5%B5%C4%BA%EA%C7%F8%B1%F0

0 0
原创粉丝点击