- 宏的用法
- 宏的本质是什么?
- 宏的特性带来的好处?缺陷
- 什么时候能使用宏?
跳转上章《变量的声明周期和作用域》
宏的用法
// 定义一个名为PI的宏
#define PI 3.14
// 定义一个名为R的宏
#define R 2
int main()
{
int s = PI * R * R;
return 0;
}
在visual stdio中放置两个断点
把宏PI 宏R 和变量s拉到调试监视窗口中观察。
运行 double s = PI * R * R; 之前是这样的:
运行 double s = PI * R * R; 之后是这样的:
变量s被赋值为3.1422的算术结果。
宏PI和宏R 在监视窗口中全程显示为未定义标识符。
宏的本质是什么?
宏的本质是替换。在预编译期间编译器把宏PI被替换成3.14 ,宏R被替换成2 。
// main.c int s = PI * R * R;
// main.i int s = 3.14 * 2 * 2;
宏的特性带来的好处?缺陷
好处:因为宏的本质是替换:在使用宏时没有定义变量——节省了内存空间,减少了数据在内存与CPU之间搬运的次数——提升了程序速度(性能)。
缺陷:这个替换过程中编译器的工作是不严谨的,只是简单的将宏的内容替换,而缺少对宏的内容的正确行的检查。
//如果在 main.c中这样定义 PI #define PI 山本,我....
// 那么在 main.i宏替换后是这样的,显然继续编译下去回报错 int s = 山本,我.... * 2 * 2;
小提示:
在vs code中 或者 终端中使用 gcc -E 文件名.c -o 任意文件名.i
命令时编译器只编译到预编译阶段声明 .i 文件
调皮
什么时候能使用宏?
-
替换常量/只读的量。向PI这种,整个程序中对其PI读操作,而不需对其进行写操作的量。
注意:变量是有类型的,常量是没有类型的。如果忽视了这个特性,可能会导致一些未定义的错误!



