Lâu lâu cũng gặp mấy cái define thế này, giờ mới hiểu lý do.
Do { … } while (0) — what is it good for?
Em có xem một vài code người ta define luôn thằng for là F và while là W 
Link kia là nói về gì đấy bạn (lười dịch quá) sao lại while(0) 
À, tức là thế này: (Dịch thoáng ý nhé)
It’s the only construct in C that you can use to
#definea multi-statement operation, put a semicolon after, and still use within anifstatement. An example might help:
Dùng cái này trong C thì để khi mình dùng #define để viết nhiều dòng lệnh thì mình có thể đặt thêm đấu ; ở cuối. Mà đặc biệt là dù trong lệnh if thì vẫn xài được. Coi ví dụ nhé
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...;
Thì sẽ lỗi ngay chỗ else, do thiếu {}
Even using braces doesn’t help:
Thậm chí nếu dùng {} như sau vẫn không được:
#define FOO(x) { foo(x); bar(x); }
Using this in an
ifstatement would require that you omit the semicolon, which is counter intuitive:
Bởi vì nếu dùng if như thế này thì mình phải không đặt dấu ; ở cuối, mà vậy thì khó nhìn lắm.
if (condition)
FOO(x)
else
...
If you define FOO like this:
Nếu mình định nghĩa FOO thế này
#define FOO(x) do { foo(x); bar(x); } while (0)
then the following is syntactically correct:
Thì cái đoạn code tiếp theo đây lại đúng
if (condition)
FOO(x);
else
....
Bài này Đạt để wiki, ai muốn đóng góp dịch lại cho hay hơn thì sửa nhé.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?