在没有编译的时候它存在哪?
没预处理的时候它当然时在源文件或头文件中了,这里连连目标文件都还没,程序文件更没有,是吧?
编译时在哪?
编译的时候,准确的说是预处理的时候,它就不在了,它的位置被其值取代了。比如:
//在头文件中定义宏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这一句。
理解宏就两个字,”替换“ 宏的位置或空间在于宏定义的内容.
转自论坛回帖