C语言宏定义

1、为什么要有宏定义?

        代码中某个特定数值需要参与运算,而且该数值作用于多个地方,当需要对该数值进行修改时,希望只改动一个地方就能实现该数值的全部更新;即便某个数值只用到一次,当修改时也会面临搜索阅读大量代码、数值含义不明晰的问题;某些“操作块”封装成函数时,调用函数开销(保存上下文环境、参数调用、堆栈分配等)太大影响效率,不封装则需要多次输入相同的“操作块”内容,并且修改麻烦容易出现不一致的问题,这时就需要把“操作块”定义成宏,该方案本质是“空间换时间”。

        总之,宏的出现时为了:提供代码可读性、增加代码书写效率和提高系统运行效率。

2、宏的产生背景是什么?

        宏的本质就是“无条件替换”,而且宏只对程序的文本起作用,它眼中的世界只有文本(字符),没有逻辑运算。记得学习C时,老师告我们:“每条语句后边都要加分号“;”,但是宏定义不能加“,问原因竟然是:”就是不能,记住就行!“。现在知道原因了:如果加了分号,分号就成为了宏定义的一部分,在进行”宏展开“时直接截断语句,当然会出问题。

        确切的说, 程序源代码(*.c文件)是不能被计算机直接执行的,编译器需要对程序代码进行“一系列处理”,转换成计算机能读懂的二进制文件(*.bin)。这涉及到编译原理的知识了(如果有机会,我会就编译原理进行讲解),一系列处理包括:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。“宏展开”过程就发生在“预处理”阶段,编译器负责用实际数据替换掉宏名,所以经过了“预处理”,函数代码中就已经没有所谓宏的概念了。

下面我将做个试验,进行验证:

(1)在Fedora环境下,键入“vi test_macro.c”输入下面的代码并保存


(2)退出vi环境,键入“gcc -E test_macro.c”执行,效果如下


(3)试验结果分析:

        "gcc -E test_macro.c" 命令就是告诉编译器只对代码进行预处理,不再进行后续工作直接输出。可以看到,我们定义的宏PI和R都已经不存在了,而且都被替换成了它们各自的常量值。main函数上面的那些函数声明,是stdio.h文件的展开,预处理阶段不只进行了宏展开,还对包含的头文件进行了展开,这里不再细说。


     下一节,我们将结合试验数据,对宏使用过程中的一些注意事项进行分析。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值