zoukankan      html  css  js  c++  java
  • oc温习六:预处理指令

    预处理:分析程序前先处理的语句,它可以识别散布在程序中的特定语句。所有的预处理语句都适用“#”开头,这个符号必须是一行中的第一个非空字符。

    预处理可以大概分为三类:文件包含、宏定义和条件编译。

    1.文件包含

    文件包含:在当前文件中用到其它文件中的函数或方法或其它信息时,可以将其它文件的头文件包含进来,然后再当前文件中使用,文件包含一般放到文件的开头。

    如果使用C语言编程,文件包含是#include<> 或者 #include ""。如果使用Objective-C语言,文件包含为#import<>或者#import ""#include#import最大的区别是 #import 在导入文件的时候进行了去重复检查,此外,""<>两也是有区别的,""一般是用来引用自定义的文件,<>一般是用来引用系统的文件。程序在执行的时候,会根据你写的样式,优先去寻找对应类型的文件。比如<>会先去找系统文件,如果找不到,再去找自定义文件。所以正确的选择样式,能够提高程序的执行效率。

    循环引用:在使用文件包含的时候,会遇到A文件中用到B文件,B文件中用到A文件,这种互相使用包含的关系就有点类似死循环了,运行的时候就是报错。解决这个问题最好的办法就是用@class代替文件包含,@class就是表明有这个类,等在源文件中真正用到的时候才会去包含文件。

    2.宏定义

    在程序中,有一些常量或者简短的函数是会被多次重复调用的,对于这些常用的数据,我们可以使用宏定义。使用宏定义可以快速的完成程序中的多处配置,最大的好处就是只要修改宏定义的值,所有使用宏定义的值都会发生改变。此外,宏定义是在程序编译之前进行替换和设置,比定义成全局变量或者函数的效率要高。

    宏定义是通过#define来实现的,一般写在程序文件包含的下面。宏名通常用全部的大写字母表示,下面,就通过代码来看一下宏定义的使用。

    3.条件编译

    条件编译:在编译之前由预处理器来根据处理语句进行判断,如果满足条件,就编译满足条件下的代码。反之就不进入编译环节。
     
    条件编译主要分为两种:一种是判断是否定义过某个宏,根据是否定义过这个宏,来决定是否编译某段代码。另外,还有一组语句和条件结构中的阶梯if结构非常类似,但是写法上有区别,是#if、#elif、#else、#endif组成。需要注意的是,无论哪种,都要有#endif 结束标志。此外,最重要的一点是:条件编译中的条件不能使用普通变量,一般会选择使用宏定义。

    Xcode预处理命令:

    #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            显示编译错误信息

    参考文献:http://www.jianshu.com/p/4a133c651265

  • 相关阅读:
    4G DTU是什么 4G DTU有什么功能
    模拟量转485采集模块是什么
    vue详情页回到列表页定位到之前位置(keep-alive)
    vue插槽
    elementUI给table表头加CheckBox
    $attrs和$listeners
    parseTime-格式化时间
    localStorage设置过期时间
    前端埋点
    将接口数据通过递归过滤
  • 原文地址:https://www.cnblogs.com/lyz0925/p/7213827.html
Copyright © 2011-2022 走看看