首先,宏是C编译系统的预处理,何谓“预”?即是正式工作开始之前的准备工作。
所以宏替换是在对程序编译之前进行的。
其次,C程序由源程序变为可执行文件的三个阶段是:
预处理阶段,由预处理器对程序文本中的宏进行展开。
编译阶段,由编译器对经过预处理后的程序进行编译,并生成目标文件
链接阶段,则链接器对目标文件和用到的函数库文件进行链接,生成可执行文件。
因此,宏展开是在预处理阶段完成的。
编译阶段的优化:
死代码删除,永远也不会执行的代码,如while(false),不包括删除注释
强度削弱:在执行时用强度较短的指令替换强度较长的指令
内联函数和宏的区别:
1.内联函数在编译时展开,只是一种对编译器的建议;而宏则是在预处理阶段,直接替换
2.内联函数更近乎函数,可以在运行时调试,可以进行类型检查,自动类型转换;而宏定义则不行
内联函数和普通函数的区别:
1.内联函数会在编译时展开,不需要拷贝实参,不需要保存寄存器,也就是不需要函数调用的进栈出栈操作,执行效率比较高