#define là chỉ thị tiền xử lý (preprocessor directive); preprocessor thay thế macro bằng nội dung của nó trước khi compiler thấy code. Hiểu như tìm và thay tự động trong mã nguồn.
const khai báo một biến thực sự trong ngôn ngữ, dùng như biến thật: lấy địa chỉ (&var), truyền tham chiếu, ép kiểu, chuyển đổi, v.v.
So sánh chi tiết
| Đặc điểm | #define |
const |
|---|---|---|
| Giai đoạn xử lý | Tiền xử lý (preprocessing) | Biên dịch (compilation) |
| Kiểm tra kiểu | Không (text substitution) | Có (type safety) |
| Phạm vi (scope) | Không có (global từ điểm định nghĩa) | Có (block scope, namespace scope) |
| Lấy địa chỉ | Không thể (&MACRO lỗi) |
Có thể (&constVar) |
| Debugger | Không thấy tên macro | Thấy tên biến, giá trị |
| Bộ nhớ | Không cấp phát (text replace) | Có thể cấp phát (trừ khi tối ưu hóa bỏ) |
| Overloading/Template | Không tham gia | Tham gia bình thường |
Hiệu năng
Với tối ưu hóa bật (-O2, -O3), cả hai thường tạo ra code máy giống nhau (constant propagation, inlining). Không tối ưu thì const có thể tốn bộ nhớ, #define không.
Khuyên dùng
Luôn ưu tiên const (hoặc constexpr C++11) thay vì #define cho hằng số. Chỉ dùng #define cho: include guard, conditional compilation, hoặc macro phức tạp không thể dùng const/constexpr.