Bộ tiền xử lý C hoạt động trên "mã thông báo" và bất cứ khi nào có khả năng thay đổi ý nghĩa hoặc sự mơ hồ, nó luôn thêm khoảng trống để giữ nguyên nghĩa.
Hãy xem xét ví dụ của bạn,
(B)
không có sự mơ hồ hoặc ý nghĩa thay đổi cho dù có một khoảng trống giữa (
và )
thêm hay không không phụ thuộc vào giá trị vĩ mô của B
.
Nhưng nó không phải là trường hợp với
|B|
Tùy thuộc vào vĩ mô B
, này ở trên có thể thể là ||
hoặc |something|
. Vì vậy, preprocessor buộc phải thêm một khoảng trống để giữ nguyên các quy tắc từ vựng của C.
Hành vi tương tự có thể được nhìn thấy với bất kỳ mã thông báo nào khác có thể thay đổi ý nghĩa.Ví dụ,
#define B +
B+
sẽ tạo ra
+ +
như trái ngược với
++
vì lý do nói.
Tuy nhiên, đây chỉ là bộ tiền xử lý tuân thủ các quy tắc từ vựng C. GCC có và hỗ trợ một bộ tiền xử lý cũ được gọi là bộ xử lý truyền thống sẽ không thêm bất kỳ khoảng trắng thừa nào. Ví dụ, nếu bạn gọi Preprocessor trong chế độ truyền thống:
gcc -E -traditional-cpp file.c
sau đó
#define B
(B)
|B|
sản (không có khoảng trắng)
()
||
Nguồn
2015-06-13 00:09:03
Có lẽ vì '|' và '|| ' là các toán tử khác nhau. Tôi hy vọng ai đó viết một câu trả lời với các quy tắc chính xác cpp sử dụng. – hyde
Thật buồn cười khi thấy ai đó viết 'x | giá trị | SOME_FLAG' và hóa ra là 'x || SOME_FLAG', có lẽ đây là cách để nó không biên dịch. –
Nhưng điều đó có nghĩa là '|| 'được coi là trường hợp đặc biệt. Điều này có thể tránh được bằng cách * luôn luôn * chèn khoảng trống, mà sẽ không được chống lại các quy tắc C (ngoại trừ các macro concatenations). – usr2564301