thể trùng lặp:
Do-While and if-else statements in C/C++ macrosViệc sử dụng làm gì trong khi (0) khi chúng tôi xác định macro?
Tôi đang đọc kernel linux và tôi thấy nhiều macro như thế này:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Tại sao họ sử dụng này chứ không phải là định nghĩa nó chỉ đơn giản trong một {}?
Nhưng câu hỏi của OP đứng. Tại sao không chỉ {(ptr) -> next ...} thay vì làm {(ptr) -> next ...} trong khi (0) ;? –
arno giải thích điều đó. Nó sẽ mở rộng thành "{(ptr) -> tiếp theo ...};" do đó, một tuyên bố theo sau là một tuyên bố thứ hai. Tuy nhiên, nếu cú pháp là "if (expression) statement statement khác". Người khác sẽ không được liên kết với bất kỳ nếu, vì bạn đã viết "if (expression) tuyên bố tuyên bố" (một "{...}" và một ";" tuyên bố). –
Như Amo đã nói, đó là một thủ thuật thông minh cho phép macro có * là * một câu lệnh C phải kết thúc bằng dấu chấm phẩy. Nó làm cho hành vi macro giống hệt như một cuộc gọi hàm, cho đến khi việc xây dựng câu lệnh và kết thúc (với ';') được quan tâm. – Eddie