iOS之预处理
2019-08-14 本文已影响1人
平安喜乐698
目录
预处理由来
1. 文件包含
2. 条件编译
3. 宏定义
预处理由来
1、ANSI C标准(美国国家标准协会(ANSI)对C语言发布的标准)规定可以在C源程序中加入一些“预处理命令” ,用来改进程序设计环境,提高编程效率。
2、由ANSI C统一规定的,并不属于C语言本身的组成部分,编译程序不能识别它们,所以不能直接对它们进行编译。在对程序进行编译之前,需要先处理这些特殊的命令(即预处理)。
预处理指令(3类)
1.文件包含
2.条件编译
3.宏定义
1. 文件包含
#import "" 引用自定义头文件
#import <> 引用系统头文件
#import 不会导致重复引用(内部做了相应处理),#include 可能会导致重复引入。
2. 条件编译
1、只编译满足条件下代码,不编译其他条件下代码
2、可变参数...只能放在最后一位,__VA_ARGS__用来将...中的参数传递给宏。当参数多于1个时,__VA_ARGS__前加##,表示当可变参数没有时去掉...前面那个,。
#if bool条件
#elif 否则
#endif 结束
#ifdef 判断某个宏是否被定义
#ifndef 判断某个宏是否没被定义
例1
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"此输出 在-- %s -- 第 -- %d -- 行\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif
例2
// 是否是真机
// 不能使用#ifdef TARGET_OS_IPHONE宏变量一直存在
#if TARGET_OS_IPHONE
#else
#endif
例3
#define aaa @"aaa"
#ifdef aaa // 等价于 #if defined(aaa)
NSLog(@"xxx");
#else
#endif
3. 宏定义
预处理阶段直接将前者替换为后者,不进行语法检查。在字符串中,不会进行替换。
带参需要加括号,避免因运算符优先级导致不期望的结果
作用域:一般公用的放在pch文件中;单独文件放在文件开头(本文件内有效)。#undef baseScreenWidth 则结束baseScreenWidth的作用域
换行使用\
#用于将参数放入宏中的字符串中
##起到拼接的作用
例1
#define baseScreenWidth [[UIScreen mainScreen] bounds].size.width
例2
#define baseEstimateScale(point) ((point)/375.0f) * baseScreenWidth
例3
\
#define YTViewRadius(View, Radius)\
\
[View.layer setCornerRadius:(Radius)];\
[View.layer setMasksToBounds:YES];
例4
#
#define LOG(a) NSLog(@"hi "#a" %d", a)
Log(3) 会输出 hi 3 3
例5
##
#define Hi(a) a ## XX
int Hi(ss)=6;
NSLog(@"%d",ssXX); // 输出6
NSLog(@"%d",Hi(6));