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
#define
a multi-statement operation, put a semicolon after, and still use within anif
statement. 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
if
statement 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é.