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中编写