Tổng quan về các chỉ thị thay thế macro
Các chỉ thị thay thế macro bao gồm hai dạng của chỉ thị #define
:
- Dạng đơn giản, thường để định nghĩa một hằng số
- Định nghĩa một macro như một hàm giả với các tham số
Ngoài ra, còn có chỉ thị #undef
để hủy bỏ bất kỳ định nghĩa #define
nào trước đó. Nếu #undef
không được sử dụng, mỗi macro được định nghĩa sẽ có hiệu lực cho đến khi kết thúc quá trình biên dịch mã nguồn.
Macro được đăng ký và sau đó được sử dụng trong mã bằng tên, tuân theo các quy tắc của định danh. Theo quy ước, tên macro được viết bằng chữ cái in hoa. Tên macro có thể trùng lặp với tên của biến, hàm và các thành phần khác của mã nguồn. Việc sử dụng có chủ đích điều này cho phép linh hoạt thay đổi và tạo mã nguồn ngay lập tức. Tuy nhiên, sự trùng hợp không chủ ý giữa tên macro và một thành phần chương trình sẽ dẫn đến lỗi.
Nguyên tắc hoạt động của cả hai dạng thay thế macro là giống nhau. Sử dụng chỉ thị #define
, một định danh được giới thiệu, liên kết với một đoạn văn bản nhất định — một định nghĩa. Nếu tiền xử lý tìm thấy định danh đó sau này trong mã nguồn, nó sẽ thay thế định danh bằng văn bản liên kết với nó. Chúng ta nhấn mạnh rằng tên macro chỉ có thể được sử dụng trong mã được biên dịch sau khi đã đăng ký (điều này tương tự như nguyên tắc khai báo biến, nhưng chỉ ở giai đoạn biên dịch).
Việc thay thế tên macro bằng định nghĩa của nó được gọi là mở rộng (expansion). Việc phân tích mã nguồn diễn ra dần dần và từng dòng trong một lần xử lý, nhưng việc mở rộng trong mỗi dòng có thể được thực hiện một số lần bất kỳ, như trong một vòng lặp, miễn là vẫn tìm thấy tên macro trong kết quả. Bạn không thể bao gồm cùng một tên trong định nghĩa macro: khi thay thế, macro như vậy sẽ dẫn đến lỗi "unknown identifier" (định danh không xác định).
Trong Phần 3 của cuốn sách, chúng ta sẽ tìm hiểu về mẫu (templates), cũng cho phép tạo (hoặc thực tế là sao chép) mã nguồn, nhưng với các quy tắc khác nhau. Nếu trong mã nguồn có cả chỉ thị thay thế macro và mẫu, thì các macro được mở rộng trước, sau đó mã được tạo từ các mẫu.
Tên macro được tô sáng màu đỏ trong MetaEditor.