বিভিন্ন ব্যাখ্যা। প্রথমটি সাধারণ, দ্বিতীয়টি প্যারামিটার সহ সি প্রিপ্রোসেসর ম্যাক্রোগুলির সাথে নির্দিষ্ট:
প্রবাহ নিয়ন্ত্রণ
আমি এটি প্লেইন সি কোডে ব্যবহার করে দেখেছি। মূলত, এটি গোটোর একটি নিরাপদ সংস্করণ, কারণ আপনি এটিটি ভেঙে ফেলতে পারেন এবং সমস্ত স্মৃতি সঠিকভাবে পরিষ্কার হয়ে যায়।
gotoভালো কিছু হবে কেন ? ওয়েল, যদি আপনি কোড প্রায় কাছাকাছি যেখানে প্রত্যেক লাইন একটি ত্রুটি আসতে পারেন, কিন্তু আপনি তাদের সব একই ভাবে প্রতিক্রিয়া প্রয়োজন (যেমন হস্তান্তর পরিষ্কার আপ করার পর আপনার আহ্বানকারী ত্রুটির দ্বারা), এটি সাধারণত আরো পাঠযোগ্য একটি এড়াতে এর if( error ) { /* cleanup and error string generation and return here */ }যেমন এটি ক্লিন-আপ কোডটির সদৃশতা এড়িয়ে চলে।
যাইহোক, সি ++ এ আপনার ঠিক এই উদ্দেশ্যে ব্যতিক্রম আছে + আরআইআইআই, সুতরাং আমি এটিকে খারাপ কোডিং শৈলী বিবেচনা করব।
সেমিকোলন চেকিং
যদি আপনি কোনও ফাংশনের মতো ম্যাক্রো অনুরোধের পরে সেমিকোলনটি ভুলে যান তবে যুক্তিগুলি অনাকাঙ্ক্ষিত উপায়ে চুক্তি করতে পারে এবং বৈধ বাক্য গঠনতে সংকলন করতে পারে। ম্যাক্রো কল্পনা করুন
#define PRINT_IF_DEBUGMODE_ON(msg) if( gDebugModeOn ) printf("foo");
এটিকে দুর্ঘটনাক্রমে বলা হয়
if( foo )
PRINT_IF_DEBUGMODE_ON("Hullo\n")
else
doSomethingElse();
"অন্য" সাথে যুক্ত করার বিবেচনা করা হবে gDebugModeOn, তাই যখন fooহয় false, সঠিক কি ঘটবে জন্যই ছিল এর বিপরীত।
অস্থায়ী ভেরিয়েবলের জন্য সুযোগ সরবরাহ করা।
যেহেতু কর / যখন কোঁকড়া ধনুর্বন্ধনী রয়েছে, অস্থায়ী ভেরিয়েবলগুলির স্পষ্টভাবে সংজ্ঞায়িত সুযোগ থাকে যে তারা পালাতে পারে না।
"সম্ভবত অবাঞ্ছিত সেমিকোলন" সতর্কতা এড়ানো
কিছু ম্যাক্রো কেবল ডিবাগ বিল্ডগুলিতে সক্রিয় হয়। আপনি তাদের এগুলি সংজ্ঞায়িত করুন:
#if DEBUG
#define DBG_PRINT_NUM(n) printf("%d\n",n);
#else
#define DBG_PRINT_NUM(n)
#endif
এখন আপনি যদি এটি শর্তাধীন অভ্যন্তরে কোনও রিলিজ বিল্ডে ব্যবহার করেন তবে এটি সংকলন করে
if( foo )
;
অনেক সংকলক এটিকে একই হিসাবে দেখেন
if( foo );
যা প্রায়শই দুর্ঘটনাক্রমে লেখা হয়। সুতরাং আপনি একটি সতর্কতা পেতে। (মিথ্যা) এইটি সংকলকটি থেকে লুকিয়ে রাখে এবং আপনি সত্যিকার অর্থে এখানে কিছুই করতে চান না এমন ইঙ্গিত হিসাবে এটি দ্বারা গৃহীত হয় ।
শর্তসাপেক্ষে লাইনগুলি ক্যাপচার করা এড়ানো
পূর্ববর্তী উদাহরণ থেকে ম্যাক্রো:
if( foo )
DBG_PRINT_NUM(42)
doSomething();
এখন, একটি ডিবাগ বিল্ডে, যেহেতু আমরা অভ্যাসগতভাবে সেমিকোলনটিও অন্তর্ভুক্ত করেছি, এটি ঠিকঠাক সংকলন করে। তবে রিলিজের বিল্ডটি হঠাৎ করে এটিকে রূপান্তরিত করে:
if( foo )
doSomething();
বা আরও পরিষ্কারভাবে ফর্ম্যাট করা
if( foo )
doSomething();
যা উদ্দেশ্য ছিল তা মোটেই নয়। ম্যাক্রোর চারপাশে একটি (false ...}) যুক্ত করা নিখোঁজ অর্ধপরিবাহকে একটি সংকলন ত্রুটিতে পরিণত করে।
ওপি এর অর্থ কী?
সাধারণভাবে, আপনি ত্রুটি পরিচালনা করার জন্য সি ++ এবং ম্যাক্রোর পরিবর্তে টেমপ্লেটগুলি ব্যতিক্রম ব্যবহার করতে চান। যাইহোক, খুব বিরল ক্ষেত্রে যেখানে আপনার এখনও ম্যাক্রোগুলি প্রয়োজন (যেমন টোকেন পেষ্টিং ব্যবহার করে শ্রেণীর নাম উত্পন্ন করার সময়) বা সরল সি-তে সীমাবদ্ধ রয়েছে, এটি একটি দরকারী প্যাটার্ন।