宏定义
预处理命令:预处理命令是在编译源程序钱先对源程序进行处理,预处理完成后,编译器开始编译源程序生产可执行代码,因为预处理指令不是c语言的一部分,所以每条编译预处理命令不需要以分号结束
宏定义:宏:c语言标准允许在程序中用一个标识符来表示一个字符串,标识符称为宏名,在编译预处理时,将程序中所有的宏名用相应的字符来替换,这个过程称为宏替换
无参数的宏
#define 标识符 字符串 #表示这是个预处理命令define是宏定义的关键字,标识符是宏名,字符串是宏名所替换的内容,可以是常数,表达式
宏替换是在程序中用相应的字符串来替换名,编译器预处理程序不会对他做任何检查,如果有错误,只有在编译程序的时候才会被编译器发现
习惯上宏名用大写字母,但是用小写字母也可以
宏的作用范围是从宏定义开始到本源程序文件结束为止,也可以使用#undef来提前终止
例子
#define MAX 256
int main()
{
…
}
#undef MAX
int f()
{
…
}
因为使用了#undef,使宏名MAX只在main函数中有效
可以对宏进行嵌套
#define MIN 128
#define MAX MIN*2
有参数的宏
类似与有参数的函数,一般的形式为:#define 标识符(形参表)字符串,如果有多个参数就要用都好隔开,在程序用使用有参数的宏的形式是 标识符(实参表) (这个有点像函数的调用)
注意事项:
宏名与形参表的圆括号之间不能有括号
在宏定义的时候,字符串内的形式参数最好用括号括起来
有参数的宏与函数的比较:
有参数宏的形式参数不是变量,不分配内存空间,不需要说明数据类型,儿函数的的形参是变量,要分配内存空间,在函数定义时要指明参数的数据类型
预处理程序认为有参数宏的实参是字符串,并用它去替换形参:例子a+1,在宏里面是直接替换,但是在函数里面会计算在吧这个值传递进函数里面
使用宏替换后源程序一般会变长,而函数就不会是程序变长,宏替换不会占用运行时间,只是编译的时间稍微变长一点,而函数调用就会占用运行时间,一般用宏来代表一些较为简单的表达式比较合适