programing

C 멀티라인 매크로: do/while(0) vs 스코프 블록

prostudy 2022. 6. 2. 21:30
반응형

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 \}

안드레이 타라세비치는 다음과 같은 설명을 합니다.

  1. 구글 그룹
  2. bytes.com에서

[포맷에 약간의 변경이 가해졌다]대괄호 안에 추가된 상위 가상 주석[]].

'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스테이트먼트를 생성함으로써elsebranch(컴파일 오류 발생).

이 문제를 해결할 수 있는 한 가지 방법은 이 문제를 해결할 때;매크로 "호출" 후:

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

반응형