Bản sao có thể xảy ra:
What’s the use of do while(0) when we define a macro?
Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?
C multi-line macro: do/while(0) vs scope block"do {...} trong khi (0)" làm gì chính xác trong mã hạt nhân?
Tôi đã thấy rất nhiều tập quán như thế này, trước đây tôi dù rằng các lập trình viên muốn thoát ra khỏi một khối mã dễ dàng. Tại sao chúng ta cần một vòng lặp {...} trong khi (0) ở đây? Có phải chúng ta đang cố nói cho trình biên dịch một cái gì đó?
Ví dụ trong Linux kernel 2.6.25, bao gồm/asm-ia64/system.h
/*
* - clearing psr.i is implicitly serialized (visible by next insn)
* - setting psr.i requires data serialization
* - we need a stop-bit before reading PSR because we sometimes
* write a floating-point register right before reading the PSR
* and that writes to PSR.mfl
*/
#define __local_irq_save(x) \
do { \
ia64_stop(); \
(x) = ia64_getreg(_IA64_REG_PSR); \
ia64_stop(); \
ia64_rsm(IA64_PSR_I); \
} while (0)
Tôi nghĩ bạn đúng. Điều đó tạo ra khối mà bạn có thể thoát ra. Ngoài ra nó tạo ra một khung khác trên stack, nhưng trong hầu hết các trường hợp nó sẽ chỉ được tối ưu hóa. Để biết thêm manh mối, hãy xem các định nghĩa của ia64_ * Chúng có thể là các macro có các câu lệnh ngắt hoặc một số kiểu nhạo báng khác. – Vlad
http://stackoverflow.com/questions/1067226/c-multi-line-macro-do-while0-vs-scope-block –
Bạn có thể làm tất cả hoặc bạn không có –