`

ios 宏定义 系统版本 判定

    博客分类:
  • ios
 
阅读更多

当需要判断iOS系统版本的时候,相信很多人都会这么干:

#define SystemVersion [[UIDevice currentDevice] systemVersion].floatValue

现在告诉屌丝们一个更好的办法就是其实系统已经做了类似的宏定义,不需要我们再去定义了

在Simulator-IOS7.0/usr/include/Availability.h中已经定义了很多系统的宏:



 

然后使用:

#ifdef __IPHONE_7_0
  //iOS7的新特性代码
#endif

或者是使用:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0

  //iOS7的新特性代码
#endif(__IPHONE_OS_VERSION_MAX_ALLOWED 这个定义是在Simulator-IOS7.0/usr/include/AvailabilityInternal.h文件中)

就搞定了。

 

 

 

 下面是一些常用的宏:

// 是否高清屏

 #define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)

// 是否模拟器

#define isSimulator (NSNotFound != [[[UIDevice currentDevice] model] rangeOfString:@"Simulator"].location)

// 是否iPad

#define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

// 是否iPad

#define someThing (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)? ipad: iphone

宏的基本使用

//定义π值 3.1415926 

#define PI 3.1415926 

//则在程序用可以如下使用     

double i=2*PI*3;   

//效果相当于  double i=2*3.1415926*3;  

//预处理命令可以定义任何符合格式的形式,例如判断年份是否闰年

#define  IS_LEAP_YEAR  year%4==0&&year%100!=0||year%400==0  

//使用时则可以直接  

if(IS_LEAP_YEAR)  

//或者可以定义一个参数     1

#define  IS_LEAP_YEAR(y)  y%4==0&&y%100!=0||y%400==0  

//使用时则可以直接  

int ys=2012;   

if(IS_LEAP_YEAR(ys))     

 

//通常预处理程序定义在一行 如果好分行 比如说太长需要换行  需要使用“/”符号 表示还有下一行,多行分列也是如此,例:  

#Define  IS_LEAP_YEAR  year%4==0&&year%100!=0/  

           ||year%400==0   

//宏定义参数后边放一个# 那么在调用该宏时,预处理程序将根据宏参数创建C风格的常量字符串 例:   #define STR(x) # x  

//将会使得 随后调用的    

NSLOG(STR(Programming in Objective-c./n)); 

//显示结果为 Programming in Objective-c./n

 

 

 

关于#与##的操作符:

<1>.宏定义中字符串化操作符#:
#的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。例如

#define WARN_IF(EXPR)\

do {\

if (EXPR)\

fprintf(stderr, "Warning: " #EXPR "\n");\

} while(0)

  

 上面代码中的反斜线\主要用来转译换行符,即屏蔽换行符。

 那么如下的代码调用:

WARN_IF(divider == 0);

 将被解析为:

do {\

if (divider == 0)\

fprintf(stderr, "Warning: " "divider == 0" "\n");\

} while(0);

 

注意能够字符串化操作的必须是宏参数,不是随随便便的某个子串(token)都行的。

<2>.宏定义中的连接符##:
连接符##用来将两个token连接为一个token,但它不可以位于第一个token之前or最后一个token之后。

注意这里连接的对象只要是token就行,而不一定是宏参数,但是##又必须位于宏定义中才有效,因其为编译期概念(比较绕)。


01#define LINK_MULTIPLE(a, b, c, d) a##_##b##_##c##_##d
02typedef struct _record_type LINK_MULTIPLE(name, company, position, salary);
03/*
04* 上面的代码将被替换为
05* typedef struct _record_type name_company_position_salary;
06*/
07   
08又如下面的例子:
09#define PARSER(N) printf("token" #N " = %d\n", token##N)
10   
11int token64 = 64;
12   
13如下调用宏:
14PARSER(64);
15   
16将被解析为:
17printf("token" "64" " = %d\n", token64);
18   
19在obj-c中,如果我有如下定义:
20#define _X(A, B) (A#B)
21#define _XX(A, B) _X([NSString stringWithFormat:@"%@_c", A], B)
22gcc将报错!
23正
 
 
C语言常用的宏命令
#define              定义一个预处理宏
#undef               取消宏的定义
#include            包含文件命令
#include_next   与#include相似, 但它有着特殊的用途
#if                      编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef                判断某个宏是否被定义, 若已定义, 执行随后的语句
#ifndef             与#ifdef相反, 判断某个宏是否未被定义
#elif                  若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
#else                与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
#endif              #if, #ifdef, #ifndef这些条件命令的结束标志.
defined            与#if, #elif配合使用, 判断某个宏是否被定义
#line                标志该语句所在的行号
#                      将宏参数替代为以参数值为内容的字符窜常量
##                   将两个相邻的标记(token)连接为一个单独的标记
#pragma        说明编译器信息#warning       显示编译警告信息
#error            显示编译错误信息
 
  • 大小: 155.6 KB
分享到:
评论

相关推荐

    ios - A-常用宏定义

    //-------------------获取设备大小----判断5--------------------- #define IS_IPHONE_FIVE ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640,1136),[[UIScreen...

    iOS中常用的宏定义总结

    本文将详细介绍一些常用的iOS宏定义,包括UI元素尺寸、日志输出、系统信息获取等方面。 1. UI元素尺寸宏定义: - `NAVIGATIONBAR_HEIGHT`:定义导航栏的高度,通常为44像素。 - `STATUSBAR_HEIGHT`:定义状态栏的...

    iOS 开发常用宏总结

    在iOS开发中,宏定义(Macros)是一种常用的编程技巧,它可以提高代码的可读性和复用性。本文将对iOS开发中常见的宏定义进行总结,帮助开发者更好地理解和使用它们。 1. 字符串是否为空 `kStringIsEmpty(str)` 这个...

    IOS实现图文混排

    其中,UIFont 类用于设置文字的字体和大小,而 KFacialSizeWidth 和 KFacialSizeHeight 两个宏定义用于设置表情的大小。 在实际应用中,开发者可以使用该机制来实现各种图文混排的功能,例如实现聊天应用程序中的...

    ios-IOS项目分层.zip

    2.2.1 Macros(宏)主要存放宏定义的地方,这边有两个宏文件,Macros.h主要是项目的一些主要宏,比如字体、版本、色值等,而ThirdMacros.h主要用于存放一些第三放SDK的key值; 2.2.2 Tool(工具类)主要存放一些常用的...

    IOS 面试题

    - 宏定义是预处理器完成的,它会在编译之前替换掉所有宏调用,因此宏定义中的计算是在编译时完成的,而非运行时。 在iOS面试中,这些基础知识的掌握至关重要,因为它们不仅涉及到编程语言的基础,还涉及到内存管理...

    iOS如何获取屏幕宽高、设备型号、系统版本信息

    在iOS开发中,获取设备信息是常见的需求,主要包括屏幕宽高、设备型号和系统版本信息。这些信息在适配不同设备和系统版本时至关重要。以下是详细的获取方法: 1、获取屏幕的宽高 屏幕的宽高是进行界面布局时的重要...

    ios页面适配

    为了区分iPhone 5和其它设备的屏幕尺寸,可以使用宏定义进行判断。示例代码如下: ```objective-c #define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize...

    IOS开发规范

    4. Macro目录:宏定义文件。 5. DB目录:数据库相关文件。 6. Network目录:网络请求相关文件。 7. General目录:通用类文件。 8. Classes目录:自定义View类文件。 9. Views目录:视图控件类文件。 10. ...

    iOS开发规范

    - 宏定义:常量宏使用全大写字母和下划线分割,工具宏采用全大写形式。 1.2 类、分类、协议、对象: - 类名:首字母大写,包含名词表示对象类型。建议添加前缀和模块信息以区分命名空间。 - 分类:通过名称理解提供...

    iOS分类以及工具类汇总

    在Objective-C中,常量可以使用宏定义(#define)或者枚举(enum)来创建。 **预编译头文件(Prefix Header, .pch)** 预编译头文件在每个目标编译前都会被引入,通常用于包含系统框架、公共头文件和全局常量。这样...

    iOS开发Objective-C项目工程混淆脚本.zip

    Objective-C中可以使用宏定义、Category或Category中的方法来实现这一目的。 2. **代码混淆**:通过对代码结构进行改造,如嵌套循环、条件判断等,增加理解代码的难度。在Objective-C中,可以利用blocks、Category...

    IOS开发之路–C语言预处理

    对于程序中经常用到的一些常量或者简短的函数我们通常使用宏定义来处理,这样做的好处是对于程序中所有的配置我们可以统一在宏定义中进行管理,而且由于宏定义是在程序编译之前进行替换相比定义成全局变量或函数效率...

    iOS 大端格式和小段格式

    例如,以下宏定义可以用于将64位、32位或16位的数据从一种格式转换为另一种格式: ```c #define BigSwapLittle64(A) ((((uint64)(A)&0xff00000000000000)&gt;&gt;56)|\ (((uint64)(A)&0x00ff000000000000)&gt;&gt;40)|\ ((...

    iOS开发基础之C语言

    5. **预处理器**:预处理器指令如`#include`用于包含头文件,`#define`用于宏定义,这些在大型项目中用于组织代码和创建代码片段。 6. **输入输出**:C语言通过`stdio.h`库提供的函数如`printf`和`scanf`进行输入...

    iOS xcode4 编程 文字版

    - **预处理器指令**:解释宏定义和其他预处理器指令的作用。 - **数据类型限定符**:介绍const、volatile等关键字的用途。 2. **面向对象编程基础** - **对象**:讲解面向对象编程的基本概念。 - **消息与方法*...

    iOS 7 Programming Fundamentals.pdf

    1. iOS 7是苹果公司在2013年推出的iOS操作系统的第七个主要版本。开发者需要掌握该版本的相关特性来开发兼容的应用。 2. 《iOS 7 Programming Fundamentals》是关于iOS 7的基础编程指南,由作者Matt Neuburg撰写,...

    iOS 10 的适配问题 - 如果你浪费了一天,那么你就真的浪费了一天 - 博客频道 - CSDN.NET1

    在Objective-C中,可以使用如下的宏定义来检查系统版本: ```objc #define isiOS10 ([[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]&gt;=10) ``` 这段代码通过获取设备的系统版本字符串并...

    判断用户设备是iPad还是iPhone的代码

    这个宏定义了一个布尔变量`isPad`,如果当前设备是iPad,那么`isPad`的值为`YES`;否则,如果设备是iPhone或者未定义,其值为`NO`。 `UIUserInterfaceIdiomPad`是`UIUserInterfaceIdiom`枚举的一个成员,表示iPad...

Global site tag (gtag.js) - Google Analytics