iOS开发之笔记摘录

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)); 
上一篇下一篇

猜你喜欢

热点阅读