首页 > 其他 > 详细

C Primer Plus之C预处理器和C库

时间:2016-01-07 22:53:21      阅读:205      评论:0      收藏:0      [点我收藏+]

   编译程序前,先由预处理器检查程序(因此称为预处理器)。根据程序中使用的预处理器指令,预处理器用符号缩略语所代表的内容替换程序中的缩略语。

   预处理器不能理解C,它一般是接受一些文件并将其转换成其他文本。

   翻译程序的第一步

   对程序作预处理前,编译器会对它进行几次翻译处理。

  1. 编译器首先把源代码中出现的字符映射到源字符集)。该过程处理多字节字符和使C外观更加国际化的三元字符(?)扩展
  2. 编译器查找反斜线(\)后紧跟换行符的实例并删除这些实例。注意:在这种场合下,“换行符”代表按下回车键在源代码文件中新起一行所产生的字符,而不是符号\n代表的字符。因为预处理表达式的长度为一逻辑行,所以这个功能为预处理做了准备工作。而一个逻辑行可能会比物理行多。举例说明:
    printf("That‘s wond\    // 一个物理行
    erful!\n");            // 又一个物理行

    ↓ 可转换为

    printf("That‘s wonderful!\n");      // 一个逻辑行

    为什么说“换行符”代表按下回车键在源代码文件中新起一行所产生的字符,而不是符号\n代表的字符?且看下面分解:

    #define OW1 "Consistency is the last refuge of the unimagina\
    tive. - Oscar Wilde"
    
    #define OW2 "Consistency is the last refuge of the unimagina\
     tive. - Oscar Wilde"  // 注意最起始有一个空格,这行开头和tive之间的空格也作为字符串的一部分 
    
    printf("%s\n", OW1);
    printf("%s\n", OW2);

    ↓ 输出分别是

    Consistency is the last refuge of the unimaginative. - Oscar Wilde  //  OW1  
    Consistency is the last refuge of the unimagina tive. - Oscar Wilde // OW2
  3. 编译器将文本划分成预处理的语言符号(token)序列和空白字符及注释序列(术语语言符号代表由空格分隔的组)。注意:编译器用一个空格字符代替每一个注释。例如:
    int /* 这不是个空格 */ fox;

    ↓ 将变成

    int fox;

    C实现可能还会选用单个空格代替每一个空白字符(不包括换行符)序列

  4. 程序进入预处理阶段。预处理寻找可能存在的预处理指令,这些指令由一行开始处的#符号标识

   

 

C Primer Plus之C预处理器和C库

原文:http://www.cnblogs.com/yerenyuan/p/5111476.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!