一、宏定义
C语言标准允许在程序中用一个标识符来表示一个字符串,称为宏。标识符为宏名,在编译处理时,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换,宏分为两种:无参数的宏和有参数的宏。
1.无参数宏
无参数宏定义的一般形式为:
#define 标识符字符串
“#”代表本行是编译预处理命令。define是宏定义的关键词,标识符是宏名。字符串是宏所代替的内容,可以是常数、表达式等。 注意:宏定义和其他编译预处理命令不是以分号结尾的。
例如:使用无参数宏的程序,输入半径,求圆的周长、面积和体积。
如果没有使用宏,那么就要查找程序并修改所有的PI值。宏的作用范围是从宏定义开始到源程序文件结束为止。也可以使用#undef来提前终止作用范围。 例如:
注意:由于使用了#undef,使宏名MAX只在main函数中有效。
知识点:终止宏定义命令的一般形式: #undef 标识符
undef是终止宏定义的特定字,其作用是从该命令开始,该标识符(宏名)不再代表相应字符序列,即该标识符的作用范围到此处结束。 宏定义允许嵌套。例如:
#define MIN 10
#define MAX MIN*2

- 宏定义只是对字符串进行简单替换,而函数调用则是按程序的含义来替换形式参数。
- 宏定义只能用于简单的单行语句替换,而函数可用于复杂运算。
- 宏定义只占用编译时间,不占用运行时间,执行速度快,而函数调用、参数的传递等,都要占用内存开销。
- 宏定义在编译时展开,多次使用会让源程序增大,而函数调用不管多少次总占用相同的源程序空间。
- 宏的作用范围从定义点开始,到程序文件的末尾或使用命令#undef取消定义之前。
- 有参数的宏的形式参数不是变量,不分配内存空间,无需说明数据类型。而函数的形式参数变量,需要分配内存空间,而函数定义时要指明参数的数据类型。
二、文件包含
文件包含是指把指定源文件的全部内容包括到当前源程序文件中。文件包含命令的一般形式为:
#include "文件名"
或
#include <文件名>
1.文件包含命令中的文件名即可以用尖括号,也可以用双引号括起来,它们的区别在于查找指定文件的位置不同。
2.尖括号只在缺省目录里找到指定文件。双括号则先在源程序文件所在的当前目录里查找指定文件,如果没有找到再到缺省目录里找。
3.文件包含预处理命令#include的作用是使一个源文件可以将另一个源文件的全部内容包含进来,把指定的文件插入该命令行位置取代该命令行,从而指定的文件和当前的源程序文件练成一个源文件。
4.一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。
5.文件包含允许嵌套,即在一个被包含的一个文件中又可以包含另一个文件。
三、条件编译
条件编译是指在特定的条件下,对满足条件和不满足条件的情况分别进行处理----满足条件时编译某些语句,不满足条件时编译另一些语句。条件编译指令常用于程序的移植反面,与系统编译环境相关。在编译前先对系统环境进行判断,在进行相应的语句编译。 条件编译命令有以下几种模式:
其含义如下:
模式一:如果没有定义标识符,则编译程序段1.这里的程序段1既可以是语句组,也可以命令行。使用事例:
模式二:如果没有定义标识符,就编译程序段1,否侧就编译程序段2.
模式三:如果定义了标识符,就编译程序段1,否侧就不编译程序段。使用事例:
模式四:如果定义标识符,就编译程序段1,否侧编译程序段2.
模式五:如果表达式成立,则编译程序段1,否侧不编译该程序段.使用事例:
模式六:如果表达式成立,就编译程序段1,否侧编译程序段2.