Tôi đoán hầu hết các bạn đã từng làm việc với C/C++ đều có trực giác về cách thức xử lý tiền xử lý (nhiều hay ít). Tôi nghĩ như vậy cho đến ngày hôm nay, nhưng trực giác của tôi đã được chứng minh là sai. Đây là câu chuyện:(Lạ?) Hành vi tiền xử lý GCC
Hôm nay tôi đã thử một cái gì đó, nhưng tôi không thể giải thích kết quả. Trước hết hãy xem xét mã sau:
#define A B
#define B A
A
B
Điều gì sẽ xảy ra? Vâng, kết quả sau khi biên dịch nó với cờ -E là:
A
B
Vâng, ok, có thể không phải là điều mọi người mong đợi, nhưng điều đó là dễ hiểu. Tôi đoán rằng các bộ tiền xử lý bằng cách nào đó đã tìm ra rằng có một số vấn đề, và đã không.
Điều tiếp theo tôi đã cố gắng là thế này:
#define A B
#define B A C
#define C x
A
B
Bây giờ đến, đối với tôi, kết quả không thể giải thích:
A x
B x
Làm sao điều này xảy ra? Tôi không thể tìm ra cách hợp lý nào về chuyện này xảy ra như thế nào. Lệnh đầu tiên (#define A B) không thể được thực hiện, bởi vì sau đó A sẽ được thay thế bằng B và kết quả cuối cùng sẽ giống nhau cho cả hai. Nhưng nếu không, thì không có cách nào "A x" có thể xảy ra!
Câu hỏi của tôi: Tôi đang thiếu gì? Rõ ràng là tôi không biết chính xác cách thức xử lý tiền xử lý. Bạn có biết bất kỳ nguồn nào về nó không?
Và đây là lý do tại sao #defines cần tránh ... – Goz
Vâng, đây là lý do KHÁC .. Không phải là tôi có nghĩa là không sử dụng chúng chút nào. Đối với một số nhiệm vụ, chúng rất hữu ích (và cách để đi vào giờ sáng). – George