『C程序设计』读书笔记系列文章之第八章 预编译处理

简介:
c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译

1. 宏定义

不带参数的宏定义
用一个指定的标识符来代表一个字符串,形式:#define 标识符 字符串
几点说明:
1) 宏名一般用大写
2) 宏定义不作语法检查,只有在编译被宏展开后的源程序时才会报错
3) 宏定义不是c语句,不在行末加分号
4) 宏名有效范围为定义到本源文件结束
5) 可以用#undef命令终止宏定义的作用域
6) 在宏定义时,可以引用已定义的宏名

带参数的宏定义
定义形式:#define 宏名(参数表) 字符串 
这和函数有些类似,但他们是不同的:
1) 函数调用时,先求实参表达式值,再代入形参,而宏只是简单替换,并不求值
2) 函数调用是在程序运行时分配内存的,而宏展开时并不分配内存,也没有返回值的概念
3) 对函数中的实参和形参都要定义类型,而且要求一致,宏名无类型,其参数也没有类型。
4) 函数只有一个返回值,而宏可以得到几个结果
5) 宏替换不占运行时间,只占编译时间,而函数调用占运行时间

2. 文件包含处理

#include "文件1" 就是将文件1的全部内容复制插入到#include位置,作为一个源文件进行编译。
在#include命令中,文件名可以用" "也可以用< >,假如现在file1.c中包含file2.h文件," "表示系统先在file1.c所在目录中找file2.h,如果找不到,再按系统指定的标准方式检索目录,< >表示系统直接按指定的标准方式检索目录。所以用" "保险一点。

3. 条件编译

条件编译指不对整个程序都编译,而是编译满足条件的那部分。条件编译有以下几种形式:
1)#ifdef 标识符
  程序段1
  #else
程序段2
#endif
它的作用:当标识符在前面已经被定义过(一般用#define),则对程序段1编译,否则对程序段2编译。
2)#ifndef 标识符
程序段1
#else
程序段2
#endif
它的作用和#ifdef相反,当标识符没被定义过,对程序段1编译,否则对程序段2编译。
3)#if 表达式
程序段1
  #else
 程序段2
#endif

它的作用:当表达式值为真(非0)时,对程序段1编译,否则对程序段2编译。



   本文转自loose_went博客园博客,原文链接:http://www.cnblogs.com/michaelxu/archive/2008/04/24/1169935.html,如需转载请自行联系原作者




相关文章
|
7月前
|
自然语言处理 Java 编译器
【编译原理】第一章,什么是编译原理?
【编译原理】第一章,什么是编译原理?
|
12月前
|
存储 人工智能 算法
C++ Primer Plus 第6版 读书笔记(7)第 7 章 函数——C++的编程模块
乐趣在于发现。仔细研究,读者将在函数中找到乐趣。C++自带了一个包含函数的大型库(标准 ANSI 库加上多个 C++类),但真正的编程乐趣在于编写自己的函数;另一方面,要提高编程效率,本章和第 8 章介绍如何定义函数、给函数传递信息以及从函数那里获得信息。
132 0
|
存储 编译器 程序员
0基础C保姆自学 第二节——初步认识C语言的全部知识框架
在栈区的变量用完之后,系统会自动收回,不需要程序员手动释放,但在堆区则恰恰相反:我们需要用free函数来将我们创建的动态空间释放。否则将会造成内存泄漏。
170 0
0基础C保姆自学 第二节——初步认识C语言的全部知识框架
|
自然语言处理 前端开发 算法
前端学编译原理(一):编译引论(上)
前端学编译原理(一):编译引论(上)
258 0
|
自然语言处理 前端开发 编译器
前端学编译原理(一):编译引论(下)
前端学编译原理(一):编译引论(下)
235 0
|
存储 Java API
java编程思想第四版第十一章总结
容器类被分为两类:Collection和Map
99 0
|
Java 编译器
java编程思想第四版第八章总结
多态的含义 面向对象的三大基本特征: 封装,继承,多态。
103 0
|
设计模式 Java Android开发
java编程思想第四版第九章总结
本章非常重要, 里面的内容涉及到了三个设计模式, 以及接口的有点,掌握这些就是掌握了重点
119 0
java编程思想第四版第九章总结
|
Java 容器
|
设计模式 Java 编译器
java编程思想第四版第十章总结
内部类的特性 他允许你把一些逻辑相关的类组织在一起。
66 0