Làm việc từ 2005-10-19 C++ working draft (vì tôi không có một tiêu chuẩn tiện dụng):
Mục 16.3 định nghĩa ngữ pháp cho #define
là #define identifier replacement-list-newline
(macro đối tượng tương tự) hoặc một trong nhiều công trình xây dựng bắt đầu với #define identifier lparen
(macro giống chức năng). identifier
s được định nghĩa trong phần 2.10 là identifier-nondigit | identifier identifier-nondigit | identifier digit
. Phần 2.11 chỉ ra rằng một danh sách nhất định các số nhận dạng được coi là điều kiện vô điều kiện trong giai đoạn 7 của phần biên dịch (phần 2.1) và tôi kết luận rằng chúng không được xử lý đặc biệt trong giai đoạn 4, đó là phần mở rộng tiền xử lý. Vì vậy, có vẻ như tiêu chuẩn yêu cầu bộ tiền xử lý cho phép bạn xác định lại các từ khóa ngôn ngữ (được liệt kê trong Phần 2.11).
Tuy nhiên, bộ tiền xử lý có một từ khóa riêng, cụ thể là defined
, cũng như danh sách các macro được xác định trước (Mục 16.8). Phần 16.8 quy định rằng hành vi không xác định nếu bạn xác định lại các hành vi này, nhưng không ngăn cản trình tiền xử lý nhận ra chúng dưới dạng tên macro.
Nguồn
2010-04-28 02:02:57
Tôi khá chắc chắn tôi đã nhìn thấy điểm cuối cùng tranh luận ở đây, nhưng về mặt C99. – Potatoswatter