Do While

Β· 760 words Β· 2 minute read

κ°œμš” πŸ”—

컀널 λ§€ν¬λ‘œμ— do { .. } while(0) ꡬ문을 μ‚¬μš©ν•˜λŠ” 것을 보게 λ˜μ—ˆλ‹€. 사내 μ½”λ“œμ—μ„œλ„ μ΄λŸ¬ν•œ ꡬ문듀이 많이 λ³΄μ˜€λŠ”λ° μ²˜μŒμ—λŠ” μ˜λ―Έμ—†μ΄ μ΄μƒν•˜κ²Œ μ§œμ—¬μ§„ μ½”λ“œλΌκ³  μƒκ°ν–ˆλ‹€. 그런데 그런 ꡬ문에도 μ˜λ―Έκ°€ μžˆμ—ˆλ‹€. https://kernelnewbies.org/FAQ/DoWhile0 링크λ₯Ό 보면 μ΄λŸ¬ν•œ ꡬ문을 λ§Œλ“  μ΄μœ κ°€ κΈ°μˆ λ˜μ–΄ μžˆλ‹€. μ΄λŸ¬ν•œ ꡬ문에 λŒ€ν•œ μ΄μœ λŠ” μ•„λž˜μ™€ κ°™λ‹€.

  1. 빈 ꡬ문(empty statement)λŠ” μ»΄νŒŒμΌλŸ¬κ°€ κ²½κ³ λ₯Ό λ‚Έλ‹€.
  2. 지역 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλŠ” ꡬ역을 λ§Œλ“€μ–΄μ€€λ‹€.
  3. 쑰건문을 ν¬ν•¨ν•œ μ½”λ“œμ—μ„œ λ³΅μž‘ν•œ ν˜•νƒœμ˜ 맀크둜λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

쑰건문을 ν¬ν•¨ν•œ μ½”λ“œμ—μ„œμ˜ 맀크둜 μ‚¬μš© πŸ”—

1
2
3
#define FOO(x) \
    printf("arg is %s\n", x); \
    do_something_useful(x);

이 λ•Œ μœ„μ²˜λŸΌ μ •μ˜ν•œ 맀크둜λ₯Ό 쑰건문과 ν•¨κ»˜ μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ μ•„λž˜μ™€ 같이 μ‚¬μš©ν•˜κ²Œ λœλ‹€.

1
2
3
if (blah == 2) {
    FOO(blah);
}

그리고 이 ꡬ문에 λ§€ν¬λ‘œκ°€ 적용된 것을 μ‚΄νŽ΄λ³΄λ©΄,

1
2
3
if (blah == 2)
    printf("arg is %s\n", blah);
    do_something_useful(blah);;

μœ„μ˜ μ½”λ“œμ²˜λŸΌ 적용될 것이닀. 이 λ•Œ λ¬Έμ œκ°€ λ˜λŠ” 것은 do_something_useful(blah);κ°€ 쑰건에 관계없이 μˆ˜ν–‰λœλ‹€λŠ” 점이닀. μ΄λŸ¬ν•œ λ§€ν¬λ‘œκ°€ μ‘°κ±΄λ¬Έμ—μ„œ 싱글라인 ꡬ문으둜 μ‚¬μš©λœλ‹€λ©΄ λ¬Έμ œκ°€ 될 수 μžˆκΈ°μ—, do { … } while(0) 을 μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ 문제λ₯Ό λ°©μ§€ν•œλ‹€.

1
2
3
4
5
if (blah == 2)
    do {
        printf("arg is %s\n", blah);
        do_something_useful(blah);
    } while(0);

μ•„λž˜μ™€ 같이 일반적인 블둝 ꡬ문을 μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν–ˆμ„ λ•Œ, νŠΉμ •ν•œ κ²½μš°μ— μœ„ μ½”λ“œλŠ” λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

1
2
3
4
5
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
if (x > y)
    exch(x,y);
else
    do_something();

이 λ•Œ, 맀크둜λ₯Ό μ μš©ν•˜λ©΄ μ•„λž˜μ™€ 같이 μ μš©λ˜μ–΄ 버린닀.

1
2
3
4
5
6
7
8
9
if (x > y) {
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
}
;   // 빈 ꡬ문
else
    do_something();

ifλ¬Έ 블둝 λ‹€μŒμ— λ‚˜μ˜€λŠ” μ„Έλ―Έμ½œλ‘ μœΌλ‘œ 인해 “parse error before else” λ¬Έμ œκ°€ λ°œμƒν•˜κ²Œ λœλ‹€. 이 λ•Œ do {…} while(0) ꡬ문을 μ΄μš©ν•˜μ—¬ 맀크둜λ₯Ό μ •μ˜ν•˜λ©΄ μ•„λž˜μ™€ 같이 κ΄€λ ¨ μ—λŸ¬λ₯Ό ν”Όν•  수 μžˆλ‹€.

1
2
3
4
5
6
7
8
9
if (x > y)
    do {
        int tmp;
        tmp = x;
        x = y;
        y = tmp;
    } while(0);
else
    do_something();

λŒ€μ²΄ ꡬ문 πŸ”—

gccμ—μ„œ 이 do-while-0 ꡬ문을 λŒ€μ²΄ν•  수 μžˆλŠ” ꡬ문 ν‘œν˜„μ„ μΆ”κ°€ν–ˆλ‹€. μ•„λž˜μ™€ 같은 μ΄λŸ¬ν•œ ν‘œν˜„μ€ μ–ΈκΈ‰ν•œ λͺ¨λ“  이점을 κ°–λŠ” λ™μ‹œμ— 가독성도 보μž₯λœλ‹€.

1
2
3
4
5
#define FOO(arg) ({
    typeof(arg) lcl;
    lcl = bar(arg);
    lcl;
})