30/09/2018, 16:59

Do { … } while (0) — what is it good for?

stackoverflow.com
gilm

do { ... } while (0) — what is it good for?

c, loops
asked by gilm on 09:36PM - 02 Nov 08

Lâu lâu cũng gặp mấy cái define thế này, giờ mới hiểu lý do.

Trịnh Minh Cường viết 19:01 ngày 30/09/2018

Em có xem một vài code người ta define luôn thằng forFwhileW

Thành Phạm viết 18:59 ngày 30/09/2018

Link kia là nói về gì đấy bạn (lười dịch quá) sao lại while(0)

Nguyễn Minh Dũng viết 19:05 ngày 30/09/2018

À, 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 an if 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é.

Bài liên quan
0