第七章 预处理命令

1、宏定义

定义:C语言标准中允许程序用一个标识符来表示一个字符串,称为宏。在编译预处理时,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。

注:

a)       宏定义是由源程序中的宏定义命令完成的。宏代替是由预处理程序自动完成的。

b)      宏定义和其他编译处理命令不是以分号结尾的。

c)       宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令

d)      宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。

e)      习惯上宏名用大写字母表示,以便于变量区别。但也允许用小写字母。

f)       可以用宏定义表示数据类型,使书写方便。

g)      宏分为有参数的宏无参数的宏

(1)无参数的宏

#define 标识符 字符串

 #代表本行是编译预处理命令”,define是宏定义的关键词,标识符是宏名,字符串是宏名所代替的内容,可以使常数、表达式等

例:


宏定义允许嵌套:

(2)有参数的宏

#define 标识符(形参表)字符串

注意:

a)       程序中使用有参宏数的形式是:标识符(实参表)。

b)      如果有多个形参,像函数参数一样以逗号隔开。

c)       宏名与形参表的圆括号之间不能有空格,否则会导致错误

d)      在宏定义中,字符串内的形式参数最好用括号括起来,以避免错误。

e)       在带参宏中,形参和实参只是符号代换,不存在值传递。

f)       在宏定义中的形参是标识符,而宏调用中的实参可以是表达式

例:


2.文件包含

文件包含命令的一般形式为:

#include”文件名” 或 #include<文件名>

文件包含预处理命令#include的作用是使一个源文件可以将另一个源文件的全部内容包含进来,把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。

注意:

a)       包含命令中的文件名可以用双引号括起来,也可以用尖括号,例如:

#include”stdio.h”

#include<math.h>

b)      一个include命令只能制定一个被包含文件,若有多个文件要包含,则需使用多个include命令。

c)       文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。

3、条件编译

条件编译是指在特定的条件下,对满足条件和不满足条件的情况分别进行处理——满足时编译某些语句,不满足时编译另一些语句。

条件编译常用于程序的移植等方面,与系统编译环境相关。在编译前先对系统环境进行判断,在进行相应的语句编译。

条件编译有以下几种模式

模式一:如果没有定义标识符,则编译程序段1

#ifndef 标识符

程序段1

#endif

模式二:如果没有定义标识符,就编译程序段1,否则就编译程序段2。

#ifndef 标识符

程序段1

#else

程序段

#endif

模式三:如果定义了标识符,就编译程序段1,否则就不编译该程序段

#ifdef 标识符

程序段1

#endif

模式四:如果定义了标识符,就编译程序段1,否则就编译程序段2。

#ifdef 标识符

程序段1

#else

程序段2

#endif

模式五:如果表达式成立,就编译程序段1,否则就不编译该程序段

#if 标识符

程序段1

#endif

模式六:如果表达式成立,就编译程序段1,否则就编译程序段2。

#if 标识符

程序段1

#else

程序段2

#endif

宏定义与函数的区别

1、宏定义只是对字符串进行简单替换,而函数调用则是按程序的含义来替换形式参数

2、宏定义只能用于简单的单行语句替换,而函数可用于复杂运算

3,宏定义只占用编译时间,不占用运行时间,执行速度快,而函数调用、参数的传递等,都要占用内存开销。

4、宏定义在编译时展开,多次使用会让源程序增大,而函数调用不管多少次总占用相同的源程序空间

5、宏定义的作用范围从定义点开始,到程序源文件的末尾或使用#undef取消定义之前。

6、有参数的宏的形式参数不是变量,不分配内存空间,无需说明数据类型。而函数的形式参数是变量,需要分配内存空间,在函数定义时要指明参数的数据类型。

此代码在vs2010中编写