আমার 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
।