C 멀티라인 매크로: do/while(0) vs 스코프 블록
중복 가능성:
매크로를 정의할 때 do while(0)이 무슨 소용이 있습니까?
C/C++ 매크로에 의미 없는 do/while 및 if/else 문이 있는 이유는 무엇입니까?
(0)이 유효할 때 {... }을(를) 수행합니다.
다음과 같이 do/while(0) 루프 안에 랩된 여러 줄의 C 매크로를 본 적이 있습니다.
# FOO의 정의 \{\}을(를) 실행하다do_stuff_여기에 \do_more_strup \} (0) 동안
기본 블록을 사용하는 것과 달리 코드를 작성할 경우 어떤 이점이 있습니까?
# FOO의 정의 \{ \do_stuff_여기에 \do_more_strup \}
안드레이 타라세비치는 다음과 같은 설명을 합니다.
[포맷에 약간의 변경이 가해졌다]대괄호 안에 추가된 상위 가상 주석[]
].
'do/while' 버전을 사용하는 전체 아이디어는 복합문이 아닌 일반 문장으로 확장되는 매크로를 만드는 것입니다.이는 함수 스타일의 매크로를 모든 컨텍스트에서 일반 함수의 사용과 동일하게 사용하기 위해 수행됩니다.
다음 코드 스케치를 고려합니다.
if (<condition>) foo(a); else bar(a);
어디에
foo
그리고.bar
일반적인 함수입니다.이제 기능을 대체하고 싶다고 상상해 보십시오.foo
상기의 성질을 가진 매크로[명칭]로CALL_FUNCS
]:if (<condition>) CALL_FUNCS(a); else bar(a);
매크로가 두 번째 접근법에 따라 정의되어 있는 경우(단,
{
그리고.}
의 'true' 브랜치가 존재하기 때문에 코드는 컴파일되지 않습니다.if
이제 복합문으로 표현됩니다.그리고 당신이 그것을 넣었을 때;
이 복합적인 진술 후에, 당신은 모든 것을 끝냈다.if
스테이트먼트를 생성함으로써else
branch(컴파일 오류 발생).이 문제를 해결할 수 있는 한 가지 방법은 이 문제를 해결할 때
;
매크로 "호출" 후:if (<condition>) CALL_FUNCS(a) else bar(a);
이것은 컴파일 되어 예상대로 동작하지만 균일하지 않습니다.보다 우아한 해결책은 매크로가 복합문이 아닌 일반문으로 확장되도록 하는 것입니다.이를 실현하기 위한 한 가지 방법은 다음과 같이 매크로를 정의하는 것입니다.
#define CALL_FUNCS(x) \ do { \ func1(x); \ func2(x); \ func3(x); \ } while (0)
이 코드는 다음과 같습니다.
if (<condition>) CALL_FUNCS(a); else bar(a);
는 문제없이 컴파일 됩니다.
단, 제 정의의 작지만 중요한 차이점에 주목해 주십시오.
CALL_FUNCS
이치노는 한 푼도.;
후에} while (0)
를 .;
그 정의의 마지막에 'do/while'을 사용하는 전체 포인트를 즉시 배제하고 그 매크로를 복합문 버전과 거의 동등하게 만들 것이다.왜 이 코드에 을 넣었는지
;
후에while (0)
이 형태에서는 두 변형 모두 동일합니다.while' 이 'do/while'을하지 않는 입니다.;
(위에서 설명한 이유로) 매크로로 변환합니다.
언급URL : https://stackoverflow.com/questions/1067226/c-multi-line-macro-do-while0-vs-scope-block
'programing' 카테고리의 다른 글
Vue.js: 이벤트버스가 여러 번 호출됨 (0) | 2022.06.03 |
---|---|
플로트와 더블의 차이점은 무엇입니까? (0) | 2022.06.02 |
어레이의 최대 사이즈가 너무 큰 이유는 무엇입니까? (0) | 2022.06.02 |
Vue: 라우팅에서 컴포넌트를 두 번째로 렌더링하지 않음 (0) | 2022.06.02 |
Vuex를 사용하여 컴포넌트에 데이터 바인딩 (0) | 2022.06.02 |