当需要判断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文件中)

就搞定了。

下面是一些常用的宏:

// 是否5s

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

// 是否高清屏

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

01#define WARN_IF(EXPR)\

02do {\

03if (EXPR)\

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

05} while(0)

06

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

08   09那么如下的代码调用:

10WARN_IF(divider == 0);

11   12将被解析为:

13do {\

14if (divider == 0)\

15fprintf(stderr, "Warning: " "divider == 0" "\n");\ 16} 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            显示编译错误信息

ios 宏定义 系统版本 判定的更多相关文章

  1. Windows系统版本判定那些事儿

    v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...

  2. ios宏定义字符串

    ios宏定义字符串 #define objcString(str) @""#str"" 使用效果: objcString(字符串)

  3. Windows系统版本判定那些事儿[转]

    Windows系统版本判定那些事儿 转自CSDN,原文链接,我比较不要脸, 全部给复制过来了 前言 本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度 ...

  4. 高效的iOS宏定义

    iOS开发过程中使用一些常用的宏可以提高开发效率,提高代码的重用性:将这些宏放到一个头文件里然后再放到工程中的-Prefix.pch文件中(或者直接放到-Prefix.pch中)直接可以使用,灰常方便 ...

  5. ios宏定义学习

    宏简介: 宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串).这种替换在预编译时进行,称作 ...

  6. iOS宏定义

    1.__OBJC__宏定义作用 在.pch 文件中一般都会自动加上这句宏定义,表示宏内引用的文件确保只被使用Objective-C语言的文件所引用,保证引用关系的清晰.因为在一个OC工程中,可能包含. ...

  7. Windows系统版本判定那些事儿(有图,各种情况,很清楚)

    前言 本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度讨论下Windows获取系统版本的方法和遇到的一些问题.在Win8和Win10出来之后,在获取 ...

  8. ios宏定义应该呆在恰当的地方

    项目为了看起来整洁 并减少不必要的多次拼写 我们会把这样的方法 做成宏定义 那么问题来了 很多文件同时用到一个或多个宏定义 写完之后就会变成这个样子 看起来很乱 阅读性也不好 那么问题来了怎么解决嘞 ...

  9. iOS宏定义的使用与规范

    宏定义在很多方面都会使用,例如定义高度.判断iOS系统.工具类,还有诸如文件路径.服务端api接口文档.为了对宏能够快速定位和了解其功能,我们最好在定义的时候将其放入特定的头文件中 定义尺寸类的宏 D ...

随机推荐

  1. HTML5 之Canvas 绘制时钟 Demo

    <!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...

  2. HDOJ 2444 The Accomodation of Students

    染色判读二分图+Hungary匹配 The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limi ...

  3. Cotex-M3内核STM32F10XX系列时钟及其配置方法

    一.背景 最近做个项目,需要使用STM32,还是以前一样的观点,时钟就是MCU心脏,供血即时钟频率输出,想要弄明白一个MCU,时钟是一个非常好的切入点.言归正传,网上已经有太多大神详述过STM32的详 ...

  4. Junit基础整理

    项目引进Junit包 对待测试类新建testcase testcase类分为:@RunWith() -----@RunWith(suite.class)测试套件类打包测试 -----@RunWith( ...

  5. Windows下MySQL 5.6安装及配置详细图解

    一.安装前的准备 1.下载安装程序包,可到MySQL官方网站http://www.mysql.com/下载,如图1-1: 图1-1 下载后的安装文件如图1-2所示: 图1-2 二.安装 1.双击下载的 ...

  6. 扩展RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  7. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之三

    五.睡眠和唤醒一个线程 有时,你会想要在一段特定的时间后再去中断线程的运行.举个例子,程序中的一个线程每一分钟检查一次传感器的状态,剩余的时间,线程应该处于空闲的状态.在这段空闲时间里,线程不会使用计 ...

  8. iOS开发——UI基础-UIButton、UIImageView、UILabel的选择

    1.UILabel - UILabel的常见属性 @property(nonatomic,copy) NSString *text; 显示的文字 @property(nonatomic,retain) ...

  9. 运动曲线提升CSS动画效果

    原文链接 译文\译者鞠大宝 先有UI动画,然后才会有好的UI动画.好的动画会让人惊叹“哇哦!”——因为页面看上去很流畅.很漂亮,最重要的是,自然,一点都不会让人觉得不和谐或者僵硬死板.如果你经常逛Dr ...

  10. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...