C预处理

前言:这个知识点折腾了好久(大约耗时7-8天。。可能我比较墨迹吧,回头想了一哈,前期主要花费到知识的归类#define #if这些,后期主要在想宏嵌套的问题)。

什么是预处理

  C语言标准规定,预处理是指前4个编译阶段(phases of translation)

    1. 三字符组与双字符组的替换      
    2. 行拼接(Line splicing): 把物理源码行(Physical source line)中的换行符转义字符处理为普通的换行符,从而把源程序处理为逻辑行的顺序集合。
    3. 单词化(Tokenization): 处理每行的空白、注释等,使每行成为token的顺序集。
    4. 宏扩展与预处理指令(directive)处理.

   1.三字符组与双字符组的替换

    三字符组(trigraph)与双字符组(Digraph)是程序设计语言(如C语言)中3个或者2个字符的序列,在编译器预扫描源程序时被替换为单个字符。以解决某些键盘不能输入某些编程必须的字符问题

    早期键盘是非标准的,所以导致C语言某些规定的字符,在非标准键盘上不存在该键字符,所以需要对不存在的键的字符进行编码

    其实很好理解,知道红绿灯的含义吗?红灯停,绿灯行。当没有红绿灯时在现实生活中怎么解决这个问题?交警叔叔,手动指挥(结合生活阅历仔细想想这个问题)

    C语言需要使用符号大概有:#、\、^.等等。

    如果键盘上没有这些符号怎么办?那么使用已有的符号组成表示一个未知的符号(说到这里,又想到了一个类似的问题,键盘为什么没有汉字的字符?原因就是汉字字符太多了,要满足这个需求可能要做一个超大面积的键盘。)

    

  2.行拼接

    把物理源码行(Physical source line)中的换行符转义字符处理为普通的换行符,从而把源程序处理为逻辑行的顺序集合。

    

  3.单词化

    处理每行的空白、注释等,使每行成为token的顺序集。

    注释使用空白字符替换如(C标准没有规则用什么字符替换,但是预处理器一般采用空格替换)

   

1  int/*我会被替换为空白字符*/1111; 等价于 int 1111;

  4.宏扩展与预处理指令(directive)处理.(最主要的内容)

   用于预处理的指示符称为预处理指示符(preprocessing directives),C语主要有三大类预处理指示符——条件段(if-section)预处理指示符、控制行(control-line)预处理指示符、空指指示符(null directive)

   以上来之 《C语言编程魔法书基于C11标准-》第十章

   反正我看这个归类也是嘻嘻哈哈的,不知所云。那么就直接说用途

   1.条件预编译

    条件预编译用来控制所要编译的代码。当条件预编译中的条件为真时,这段预编译块中的代码参与编译,否则不参与编译

    本质上和C语言if语法没有什么区别,属于流程分支种的一种情况https://www.cnblogs.com/binaryAnt/p/11100556.html

    要我说if是在程序运行时,根据条件真假选择某块语句是否使用。

    而 条件预编译 是选择某块源代码是否参与编译。

    #if  #ifndef  #indef  #elif #end (应该没有写漏,只有这些)

    #if 有两种格式

      1.#if  常量表达式

      2.#if  defined 宏标识符

          defined运算符有点类似sizeof运算符。如果标识符已经定义那么 defined结果为1,否则为0

          还可以这样:#if defined(宏标识符)  sizeof(int) == sizeof

        

    #if  常量表达式      ,根据常量表达式的结果 判断

    #if  defined 宏标识符    ,根据宏标识符是否定义 判断

  先睡觉

      

    

    

   

    

  

    

猜你喜欢

转载自www.cnblogs.com/binaryAnt/p/11318838.html