依旧是由于腾讯的面试,我意识到自己的渣。。。面试官问我宏定义的define和const的区别,我只回答了宏定义是预编译,所以速度上比const更快一些,剩下的没回答什么。虽然我也知道define不仅可以定义数,还可以定义函数,但是当时确实没有往这个方向想,所以我想在这里总结一下,为以后的面试和开发做准备。
在说区别之前,有几点背景知识是我们需要掌握的。
(截图说话,侵删)
这是C语言编译的过程,C++无异。
- 首先都是预编译阶段,所谓预编译,就是要做到:宏替换、去注释、展开头文件、条件编译,将 .c 文件变成 .i 文件。
- 其次,就是编译阶段。编译阶段需要检查语法并生成汇编语言,即 .i 文件生成 .s 文件。
- 第三阶段,将汇编文件变成机器可读的机器代码,所谓机器代码,就是01代码,.s变成.o文件
- 最后机器文件链接,生成可执行的 .out文件。
接下来说重点:
区别:
- #define是宏定义,是在预编译阶段处理,进行宏替换;const是在编译阶段起作用;
- #define是宏替换,不会检查类型,而const会进行类型判断,能够在编译阶段检查一些错误;
- #define替换的地方都会在内存中存储,有n个备份,n=替换数,而const只有一个备份,节省内存空间;
- #define无法调试,const可以调试。
优缺点(其实和区别对应):
- const可以进行调试,且比较省内存空间,能够提升程序运行效率;
- #define占用内存更多,但是依然能够提升程序运行效率,但是可以替换函数。