宏定义的编译链接

在没有编译的时候它存在哪?编译时在哪?编译后又在哪?不管怎样,你总要给人家一个空间吧!尤其是在编译的时候。。。您说对不?  还是不太懂,您说的方法呢,也不太懂。能简单描绘一下吗? 引用 4 楼  的回复: 这样子,你找个装有gcc的机器,找个带宏的.c文件,把头文件和这个.c文件放一个目录。 终端中运行:gcc -E xxx.c | > xxx.txt “xxx”是你.c文……


在没有编译的时候它存在哪?
没预处理的时候它当然时在源文件或头文件中了,这里连连目标文件都还没,程序文件更没有,是吧?

编译时在哪?
编译的时候,准确的说是预处理的时候,它就不在了,它的位置被其值取代了。比如:
//在头文件中定义宏set_pll
#define set_pll(mdiv, pdiv, sdiv)       \
        (1<<31 | mdiv<<16 | pdiv<<8 | sdiv)
//在源文件中使用宏(预处理前),位置源文件
APLL_VAL = set_pll(400, 3, 1);
//在源文件中使用宏(预处理后),这里看不到宏了吧,只是一个表达式,它还是在文件中
APLL_VAL = (1<<31 | 3<<16 | 3<<8 | 1)

编译后又在哪?
编译后,在数据段的某个位置有个值为(1<<31 | 3<<16 | 3<<8 | 1)就这么多,懒得算了。

完了。。。

这只是个例子,并不是全部的宏都是这个样子,如果宏中有代码,比如,#define max(a, b)  a>b ? a:b如果程序中有使用这个宏,那么在代码段就会有a>b ? a:b这一句。

理解宏就两个字,”替换“ 宏的位置或空间在于宏定义的内容.

转自论坛回帖

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值