在 C++ 面试中,#define与constexpr的对比堪称 “元老级” 考点 —— 据统计,在 2023-2024 年的 C++ 工程师面试中,该知识点的出现频率高达 72%,尤其是在字节跳动、腾讯、华为等企业的校招 / 社招中,几乎是必问内容。
这两个语法元素都与 “编译期常量” 相关,但背后却代表着 C++ 发展的两个时代:#define是 C 语言遗留的 “文本替换工具”,而constexpr是 C++11 引入的 “编译期计算神器”。理解它们的区别与联系,不仅能应对面试,更能体现你对 C++ 语言进化的深刻理解。
本文将从基础语法到底层实现,结合历年真题,彻底搞懂这对 “冤家” 的前世今生,轻松应对从初级到资深工程师的面试挑战。
一、基础概念:两个 “常量工具” 的本质区别
1.1 #define:C 语言时代的 “文本替换机”
#define是预处理指令,作用是在编译前的预处理阶段进行纯文本替换,不涉及类型检查,也不理解 C++ 语法。
// 基本用法:定义宏常量
#define MAX_SIZE 1024
#define PI 3.1415926// 带参数的宏(类似函数)
#define SQUARE(x) (x) * (x)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
工作流程:预处理阶