在c语言的编写中允许一个字符串代替一串字符串,我们将这种代替操作称之为“宏操作”
1.1 #define 宏定义宏名要求命令 一个#define 只能定义一条宏,如果需要定义多条宏需分多行並采用多个#define
1.2 标识符通常采用大写字母,字符串可以是变量 关键字 语句 表达式 函数 空白等等
1.3 在编译器进行编译的前期,编译器会根据宏定義宏名要求规则替换当前文件下所有同宏(标识符)相同的标识符进行替换
2.1 不带参数宏定义宏名要求:用标识符来代替一个字符串,或一串没有特殊字符(括号 下标号 表达式)的字符串,通常用于定义符号常量
以上的定义,将会使程序在编译之前会将出现AAA BBB TYPEINT 标识符的地方都替換为 1 0 int,然后再进行编译
2.2 宏定义宏名要求允许嵌套定义 例:
2.3 不带参数宏定义宏名要求优点
2.3.1 使用宏定义宏名要求可以对系统中比较常用并且较長的表达式,进行缩写
2.3.2 使用宏定义宏名要求设置程序中相关参数,方便程序的调整
三、带参数宏定义宏名要求 在宏定义宏名要求中的參数称之为形参,在宏调用中使用的参数称之为实参在进行编译器的替换时,需要进行字符串的替换同时还要进行参数的替换。
四、帶参数的宏和函数的区别 4.1 函数调用时先得出参数的值,然后传入函数中进行计算;宏则只进行字符串替换不进行计算;
4.2 函数调用发生茬程序运行时;宏则是发生在编译时;
4.3 函数的形参和实参都需定义类型;宏定义宏名要求时不用定义类型;
4.4 函数调用时,只有一个返回值;宏调用时候可以有很多个值发生变化;
4.5 函数不会使源代码变长;宏会使源代码变长;
4.6 函数调用会消耗程序运行时间宏调用则不会消耗程序运行时间,只会增加程序编译时间;
五、使用宏定义宏名要求时注意事项 5.1 宏定义宏名要求通常采用大写字母来区别变量的定义
5.2 宏定義宏名要求就是用宏名来代替一串字符串,编译时程序会自动将标识符等于宏名的地方采用字符串替换,这是一种简单的替换不会做任何检查。
5.3 宏定义宏名要求不是说明语句行结束不需要使用分号结束,如果加上分号,替换的时候会将分号作为字符串的一部分 一起去替換标识符
5.4 宏参数定义时,宏名和形参之间不能有空格
5.5 宏参定义时,形参 通常采用小括号
5.6 宏命令的有效范围:宏命令定义在函数外部,則在整个程序文件中都有效
5.7 可以采用undef 终止宏定义宏名要求的有效范围。 例:
//以上代码程序编译的时候就会提示找不到AAA 的定义。