?在 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))
工作流程:預處理階