मेरे 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
।