do {…} while (false) } while(false); <tidy-up

개인의 일부 코드를 살펴 보았는데 그의 기능에 패턴이있는 것 같습니다.

<return-type> function(<params>)
{
 <initialization>

 do
 {
   <main code for function>
 }
 while(false);

 <tidy-up & return>
}

나쁘지 않고 더 독특합니다 (실제 코드는 상당히 깔끔하고 놀랍지 않습니다). 그것은 내가 전에 본 것이 아니며 누군가 그 뒤에있는 논리를 생각할 수 있는지 궁금했습니다.



답변

할 수 있습니다 break아웃 do{...}while(false).


답변

많은 사람들이 “goto”를 쓰는 어색한 방법으로 break와 함께 자주 사용된다고 지적합니다. 함수에 직접 작성 되었다면 아마도 사실 일 것입니다.

매크로에서 OTOH do { something; } while (false)는 매크로 호출 후 세미콜론을 강제 하는 편리한 방법이며, 다른 토큰은 절대 따라 올 수 없습니다.

또 다른 가능성은 한 번 거기에 루프가 있었거나 미래에 반복이 추가 될 것으로 예상된다는 것입니다 (예 : 테스트 기반 개발에서는 테스트를 통과하는 데 반복이 필요하지 않았지만 논리적으로 다음과 같은 경우에 루프하는 것이 합리적 일 것입니다. 기능은 현재 필요한 것보다 다소 더 일반적이어야 함)


답변

goto로서의 휴식이 아마도 답일 것입니다. 그러나 나는 다른 아이디어를 제시 할 것입니다.

아마도 그는 지역적으로 정의 된 변수를 갖고 싶었고이 구조를 사용하여 새로운 범위를 얻었습니다.

최근 C ++에서는 {...}어디에서나 허용되지만 항상 그런 것은 아닙니다.


답변

함수에 대한 잠재적 인 종료 점이 많을 때 유용한 패턴으로 사용되는 것을 보았지만 함수가 종료되는 방법에 관계없이 항상 동일한 정리 코드가 필요합니다.

종료 지점에 도달 할 때마다 중단하고 나중에 나머지 논리를 인라인으로 처리함으로써 귀찮은 if / else-if 트리를 훨씬 쉽게 읽을 수 있습니다.

이 패턴은 goto 문이없는 언어에서도 유용합니다. 아마도 원래 프로그래머가 패턴을 배운 곳일 것입니다.


답변

나는 그런 코드를 보았으므로 일종의 break것으로 사용할 수 있습니다 goto.


답변

이것은 while의 의미를 얻기 위한 변태 일뿐 입니다.goto tidy-up goto라는 단어를 사용하지 않고 입니다.

외부 의 다른 루프 를 사용 하면 독자에게 모호해 지기 때문에 잘못된 형식 입니다. “이것이 출구로 가야하나요? 아니면 내부 루프를 벗어나기위한 것입니까?”whilebreaks


답변

. break대신 작성하는 것이 더 편리하다고 생각합니다 goto end. 의도를 명확하게하는 레이블의 이름을 생각할 필요도 없습니다. 특정 이름을 가진 레이블로 이동하고 싶지는 않습니다. 여기서 나가고 싶어.

또한 어쨌든 중괄호가 필요할 가능성이 있습니다. 그래서 이것은 do{...}while(false);버전입니다 :

do {
   // code
   if (condition) break; // or continue
   // more code
} while(false);

그리고 이것이 사용하고 싶다면 표현해야 할 방법입니다 goto.

{
   // code
   if (condition) goto end;
   // more code
}
end:

첫 번째 버전의 의미를 이해하기 훨씬 쉽다고 생각합니다. 또한 작성하기 쉽고 확장하기 쉬우 며를 지원하지 않는 언어로 번역하기가 더 쉽습니다 goto.


의 사용에 대해 가장 자주 언급되는 우려 break는 심하게 위장 된 goto. 그러나 실제로 break는 다음과 더 유사합니다 return. 두 명령어 모두에 비해 거의 구조화 된 코드 블록에서 튀어 나옵니다 goto. 그럼에도 불구하고 두 명령어 모두 코드 블록에서 여러 개의 종료점을 허용하므로 때때로 혼란 스러울 수 있습니다. 결국 나는 특정 상황에서 가장 명확한 해결책을 찾으려고 노력할 것입니다.