编译一个C程序的第1个步骤是预处理(preprocessing)阶段。C预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件的内容、定义和替换由#define指令定义的符合以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。

1. #define

用法:

#define name stuff

有了这条指令以后,每当有符合name出现在这条指令后面时,与处理器就会把它替换成stuff

所有用于对数值表达式进行求值的宏定义都应该整个表达式两边加上一对括号。

使用#undef移除一个宏定义。

2.条件编译

#if constant-expression

statements

#endif

其中,constant-expression(常量表达式)由预处理器进行求值,如果它的值非零值(真), 那么statements部分就被正常编译,否则预处理器就安静第删除它们。

例如,将你所有的调试代码都以下面这种形式出现:

#if DEBUG
printf("x=%d, y=%d\n",x,y);
#endif

这样,不管我们是想编译还是忽略这个代码都很容易办到。如果想要编译它,只要使得

#define DEBUG 1

这个符号定义就可以了。如果想要忽略它,只要把这个符号定义为0就可以了。

条件编译的另一个用途是在编译时选择不同的代码部分。为了支持这个功能,#if指令还具有可选的#elif和#else子句。

是否被定义?

测试一个符号是否已被定义:

#ifdef symbol

#ifndef symbol

3.文件包含

#include指令使另一个文件的内容被编译。替换方式:预处理器删除这条指令,并用包含文件的内容取而代之。这样,一个头文件如果被包含到10个源文件中,它实际上被编译了10次。

开销问题:如果两个源文件都需要同一组声明,把这些声明复制到每个源文件中所花费的编译时间跟把这些声明放入一个头文件,然后再用#include指令把它包含于每个源文件所花费编译时间相差无几。同时,这种开销只是在程序被编译时才存在,所以对运行时效率并无影响。更重要的是,把这些声明放于一个头文件中具有重要的意义。

所以,和把一个程序需要的所有声明都放入一个巨大的头文件相比,使用几个头文件,每个头文件包含于某个特定函数或模块 。

最新文章

  1. windows 下用eclipse搭建java、python开发环境
  2. && 和 ||的区别
  3. 协处理器,王明学learn
  4. java画图程序_图片用字母画出来
  5. Java垃圾回收(GC)与引用的种类
  6. 实时数据处理环境搭建flume+kafka+storm:1.zookeeper 安装配置
  7. Unity3D动态加载外部资源
  8. 348. Design Tic-Tac-Toe
  9. MYSQL insert
  10. 几种能在O(n*log(n))时间排序
  11. Amazon才推众包物流,“京东众包”已红绿上阵,“达达”还手握10万配送大军
  12. 【learning】kd-tree
  13. vue开发中遇到的问题集锦(2)
  14. jsonpCallback: xx is not a function
  15. 【STM32】临界区进入退出宏 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()
  16. Android上显示生僻字的方法
  17. day 03 基本数据类型的使用、运算符
  18. BZOJ3489 A simple rmq problem K-D Tree
  19. Jenkins部署码云SpringBoot项目
  20. Servlet过滤器实现访客人数统计

热门文章

  1. python配置yum源
  2. [简短问答]LODOP如何查看用LODOP打印设计的代码
  3. 使用ClientScriptManager向客户端注册脚本
  4. jsplumb 流程图,常用功能配置记录
  5. git:early EOF the remote end hung up unexpectedly index-pack failed RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
  6. charles 文件菜单总结
  7. selenium3 web自动化测试框架 三:项目实战中PO模型的设计与封装
  8. 最新 金蝶软件java校招面经 (含整理过的面试题大全)
  9. clog就用clog的后缀名
  10. vscode配置phpxdebug