iOS之预处理

作者: 平安喜乐698 | 来源:发表于2019-08-14 17:56 被阅读1次
    目录
    
      预处理由来
      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)); 
    

    相关文章

      网友评论

        本文标题:iOS之预处理

        本文链接:https://www.haomeiwen.com/subject/nlenjctx.html