概念
在 C 语言中,可以采用命令 #define 来定义宏。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。
在 C 语言中,宏分为 有参数和无参数两种。无参宏的宏名后不带参数,其定义的一般形式为:
#define 标识符 字符串
// 不带参数的宏定义 #define MAX 10
/带参宏定义/ #define M(y) yy+3y
在编译的步骤中:
1.预处理
2.编译
3.汇编
4.链接预处理器会分析源文件,把它们转换为预处理器记号和空白符。如果遇到的记号是宏名称,预处理器就会展开(expand)该宏;也就是说,会用定义的文本来取代宏名称。出现在字符串字面量中的宏名称不会被展开,因为整个字符串字面量算作一个预处理器记号。
无法通过宏展开的方式创建预处理器命令。即使宏的展开结果会生成形式上有效的命令,但预处理器不会执行它。
宏定义的优点
1.方便程序的修改
使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。
2.提高程序的运行效率
相对于全局变量两者的区别如下:
- 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。
- 宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的。而变量在运行时要为其分配内存。
- 宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。
- 宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不需要extern。
宏定义的缺点
①由于是直接嵌入的,所以代码可能相对多一点。
②嵌套定义过多可能会影响程序的可读性,而且很容易出错,不容易调试。
③对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。