{...}을(를) 하다} 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
'programing' 카테고리의 다른 글
Vue 및 Django 개발 환경 (0) | 2022.07.28 |
---|---|
Java에서의 Key Value Pair (0) | 2022.07.28 |
Jest Vuex: 생성된 후크 오류: "TypeError: 정의되지 않은 속성 '디스패치'를 읽을 수 없습니다." (0) | 2022.07.28 |
각각 전에 VueRouter에서 약속된 getter 사용 (0) | 2022.07.28 |
Vue 및 TypeScript 클래스 데코레이터 구문과 함께 외부에서 정의된 구성 요소 사용 (0) | 2022.07.28 |