宏的定义
在 C 语言中,宏分为 有参数和无参数两种。无参宏的宏名后不带参数,
其定义的一般形式为: #define 标识符 字符串
示例:
#define M 5 // 不带参数的宏定义:
#define M(x) x*x+5*x //带参宏定义
切记:
1、不可在后面添加分号;
2、惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量
宏的优缺点:
一、优点:
1、方便程序修改:简单宏替换常量,当常量改变时,只需要改变宏,而不必整个程序去修改;
2、提高程序效率:使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率;
二、缺点:
1、由于是直接嵌入的,所以代码可能相对多一点;
2、嵌套定义过多可能会影响程序的可读性,而且很容易出错,不容易调试;
3、对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患;
宏函数的适用范围
1、一般来说,用宏来代表简短的表达式比较合适;
2、在考虑效率的时候,可以考虑使用宏,或者内联函数;
3、还有一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏
4、常用常量,可以定义为宏;
宏与其他对比:
一:宏与全局变量对比:
1、宏定义的只是一段字符,在编译期间即会使用并替换到引用的位置,在运行中是没有宏定义的概念的,不会分配内存
而全局变量要到运行时才可以,并为其分配内存;
2、宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改;
3、宏定义只有在定义所在文件或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不需要extern
C语言标准中宏定义的作用域是,从定义位置开始,到其当前所在作用域结束,即宏定义只属于当前这个文件,其他文件如果没有通过#include包含这个文件,那就不能使用这个宏定义。
二:宏与const 对比:
1、起作用的阶段: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用;
2、起作用的方式:#define只是简单的字符串替换,宏常量没有数据类型,没有类型检查,在字符替换可能会产生意料不到的错误,而const有对应的数据类型,是要进行判断的,进行类型安全检查,可