나를 위해 do{...}while(0)
괜찮습니다. 당신이보고 싶지 않으면do{...}while(0)
대체 키워드를 정의 할 수 있습니다.
예:
//--------SomeUtilities.hpp---------
#define BEGIN_TEST do{
#define END_TEST }while(0);
//--------SomeSourceFile.cpp--------
BEGIN_TEST
if(!condition1) break;
if(!condition2) break;
if(!condition3) break;
if(!condition4) break;
if(!condition5) break;
//processing code here
END_TEST
컴파일러가 불필요한 while(0)
조건을 제거 할 것이라고 생각합니다 .do{...}while(0)
바이너리 버전에서 하고 나누기를 무조건 점프로 변환 할 . 어셈블리 언어 버전인지 확인할 수 있습니다.
를 사용하면 goto
코드가 더 깨끗 해지고 조건 논리 점프 로직이 간단합니다. 다음을 수행 할 수 있습니다.
{
if(!condition1) goto end_blahblah;
if(!condition2) goto end_blahblah;
if(!condition3) goto end_blahblah;
if(!condition4) goto end_blahblah;
if(!condition5) goto end_blahblah;
//processing code here
}end_blah_blah:; //use appropriate label here to describe...
// ...the whole code inside the block.
레이블은 닫은 후에 배치됩니다 }
. 이것은 goto
레이블이 보이지 않기 때문에 실수로 코드를 넣는 문제를 피하는 것 입니다. 그것은 지금 같다do{...}while(0)
조건 코드가없는 .
이 코드를보다 명확하고 이해하기 쉽게하려면 다음과 같이하십시오.
//--------SomeUtilities.hpp---------
#define BEGIN_TEST {
#define END_TEST(_test_label_) }_test_label_:;
#define FAILED(_test_label_) goto _test_label_
//--------SomeSourceFile.cpp--------
BEGIN_TEST
if(!condition1) FAILED(NormalizeData);
if(!condition2) FAILED(NormalizeData);
if(!condition3) FAILED(NormalizeData);
if(!condition4) FAILED(NormalizeData);
if(!condition5) FAILED(NormalizeData);
END_TEST(NormalizeData)
이를 통해 중첩 블록을 수행하고 종료 / 점프 할 위치를 지정할 수 있습니다.
//--------SomeUtilities.hpp---------
#define BEGIN_TEST {
#define END_TEST(_test_label_) }_test_label_:;
#define FAILED(_test_label_) goto _test_label_
//--------SomeSourceFile.cpp--------
BEGIN_TEST
if(!condition1) FAILED(NormalizeData);
if(!condition2) FAILED(NormalizeData);
BEGIN_TEST
if(!conditionAA) FAILED(DecryptBlah);
if(!conditionBB) FAILED(NormalizeData); //Jump out to the outmost block
if(!conditionCC) FAILED(DecryptBlah);
// --We can now decrypt and do other stuffs.
END_TEST(DecryptBlah)
if(!condition3) FAILED(NormalizeData);
if(!condition4) FAILED(NormalizeData);
// --other code here
BEGIN_TEST
if(!conditionA) FAILED(TrimSpaces);
if(!conditionB) FAILED(TrimSpaces);
if(!conditionC) FAILED(NormalizeData); //Jump out to the outmost block
if(!conditionD) FAILED(TrimSpaces);
// --We can now trim completely or do other stuffs.
END_TEST(TrimSpaces)
// --Other code here...
if(!condition5) FAILED(NormalizeData);
//Ok, we got here. We can now process what we need to process.
END_TEST(NormalizeData)
스파게티 코드는 goto
의 잘못이 아니라 프로그래머의 잘못입니다. 를 사용하지 않고도 스파게티 코드를 계속 생성 할 수 있습니다 goto
.