programing

{...}을(를) 하다} while (0) — 어떤 용도로 사용할 수 있습니까?

firstcheck 2022. 7. 28. 22:14
반응형

{...}을(를) 하다} while (0) — 어떤 용도로 사용할 수 있습니까?

중복 가능성:
C/C++ 매크로에 의미 없는 do/while 및 if/else 문이 있는 이유는 무엇입니까?

10년 넘게 그 표정을 보고 있어요.그게 무엇에 좋은지 생각해봤어주로 #defines에서 볼 수 있기 때문에 내부 스코프 변수 선언이나 breaks(gotos가 아닌 breaks)를 사용하는 것이 좋다고 생각합니다.

그게 다른 데 도움이 되나요?쓰세요?

C에서 사용할 수 있는 유일한 구성체입니다.#define멀티스테이트먼트 조작, 세미콜론 뒤에 세미콜론을 붙이고, 여전히 사용if진술.예를 들면 다음과 같습니다.

#define FOO(x) foo(x); bar(x)

if (condition)
    FOO(x);
else // syntax error here
    ...;

교정기를 사용해도 도움이 되지 않습니다.

#define FOO(x) { foo(x); bar(x); }

에서의 이 사용if스테이트먼트에서는 세미콜론을 생략해야 합니다.이것은 직관에 반합니다.

if (condition)
    FOO(x)
else
    ...

FOO를 다음과 같이 정의할 경우:

#define FOO(x) do { foo(x); bar(x); } while (0)

구문적으로는 다음과 같습니다.

if (condition)
    FOO(x);
else
    ....

이는 오류 체크를 단순화하고 만약 그렇다면 완전히 중첩되지 않도록 하는 방법입니다.예를 들어 다음과 같습니다.

do {
  // do something
  if (error) {
    break;
  }
  // do something else
  if (error) {
    break;
  }
  // etc..
} while (0);

여러 문장을 하나의 문장으로 그룹화하여 함수형 매크로를 실제로 함수로 사용할 수 있도록 합니다.예를 들어 다음과 같습니다.

#define FOO(n)   foo(n);bar(n)

다음과 같은 일이 있습니다.

void foobar(int n) {
  if (n)
     FOO(n);
}

다음으로 확장됩니다.

void foobar(int n) {
  if (n)
     foo(n);bar(n);
}

두 번째 콜은bar(n)의 일부가 아닙니다.if더 이상 진술할 수 없습니다.

둘 다 로 감싸다do { } while(0)또, 의 매크로를 사용할 수도 있습니다.if진술.

다음과 같은 상황에서 do {} while (0) loop이 작동하지 않습니다.

값을 반환하는 함수형 매크로를 사용하려면 다음 중 {}을(를) 수행하는 대신 문 표현식({stmt;stmt;})이 필요합니다.


#include <stdio.h>

#define log_to_string1(str, fmt, arg...) \
    do { \
        sprintf(str, "%s: " fmt, "myprog", ##arg); \
    } while (0)

#define log_to_string2(str, fmt, arg...) \
    ({ \
        sprintf(str, "%s: " fmt, "myprog", ##arg); \
    })

int main() {
        char buf[1000];
        int n = 0;

        log_to_string1(buf, "%s\n", "No assignment, OK");

        n += log_to_string1(buf + n, "%s\n", "NOT OK: gcc: error: expected expression before 'do'");

        n += log_to_string2(buf + n, "%s\n", "This fixes it");
        n += log_to_string2(buf + n, "%s\n", "Assignment worked!");
        printf("%s", buf);
        return 0;
}

일반적으로는do/while루프를 한 이상 실행해야 하는 모든 종류의 루프 구성에 적합합니다.이러한 종류의 루프를 에뮬레이트할 수 있습니다.while또는 심지어for하지만 종종 그 결과는 조금 덜 우아합니다.이 패턴의 구체적인 적용은 매우 드물지만 실제로 존재합니다.먼저 떠오르는 것은 메뉴 기반 콘솔 애플리케이션입니다.

do {
    char c = read_input();

    process_input(c);
} while (c != 'Q');

언급URL : https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for

반응형