栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

1-1-5 C语言 宏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1-1-5 C语言 宏

C语言 宏
  • 宏的用法
  • 宏的本质是什么?
  • 宏的特性带来的好处?缺陷
  • 什么时候能使用宏?

跳转上章《变量的声明周期和作用域》


宏的用法
// 定义一个名为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读操作,而不需对其进行写操作的量。

    注意:变量是有类型的,常量是没有类型的。如果忽视了这个特性,可能会导致一些未定义的错误!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875094.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号