উত্তর:
ভিজুয়াল স্টুডিওটি সংজ্ঞা দেয় _DEBUGযখন আপনি বিকল্প /MTdবা /MDdবিকল্পটি নির্দিষ্ট করেন , NDEBUGস্ট্যান্ডার্ড-সি সংস্থান অক্ষম করে। উপযুক্ত হলে এগুলি ব্যবহার করুন, যেমন _DEBUGআপনি যদি নিজের ডিবাগিং কোডটি এমএস সিআরটি ডিবাগিং কৌশলগুলির সাথে সামঞ্জস্যপূর্ণ হন এবং NDEBUGআপনি যদি সামঞ্জস্য থাকতে চান তবে assert()।
যদি আপনি নিজের ডিবাগিং ম্যাক্রোগুলি সংজ্ঞায়িত করেন (এবং আপনি সংকলক বা সি রানটাইম হ্যাক করেন না) তবে নামগুলি আন্ডারস্কোর দিয়ে শুরু করা এড়াবেন, কারণ এগুলি সংরক্ষিত রয়েছে।
NDEBUG মান?
হ্যাঁ এটি সি 98, সি 99, সি ++ 98, সি ++ 2003, সি ++ 2011, সি ++ 2014 স্ট্যান্ডার্ডগুলির জন্য অর্থপূর্ণ "নট ডিবাগ" সহ একটি স্ট্যান্ডার্ড ম্যাক্রো। _DEBUGমানকগুলিতে কোনও ম্যাক্রো নেই ।
সি ++ 2003 মানক "176.2.2.1 শিরোনাম" এ "পৃষ্ঠা 326" তে পাঠককে স্ট্যান্ডার্ড সি তে পাঠান
এটি NDEBUG এর মতোই এটি স্ট্যান্ডার্ড সি লাইব্রেরির মতো।
সি ৮৮-এ (সি প্রোগ্রামাররা এই স্ট্যান্ডার্ডটিকে স্ট্যান্ডার্ড সি হিসাবে ডেকেছিল) "৪.২ ডায়াগনস্টিকস" বিভাগে বলা হয়েছিল
http://port70.net/~nsz/c/c89/c89-draft.html
উত্স ফাইল যেখানে বিন্দুতে NDEBUG একটি ম্যাক্রো নাম হিসাবে সংজ্ঞায়িত করা হয়, assert ম্যাক্রো কেবল হিসাবে সংজ্ঞায়িত করা হয়
#define assert(ignore) ((void)0)
যদি _DEBUGভিজ্যুয়াল স্টুডিও https://msdn.microsoft.com/en-us/library/b0084kay.aspx এর ম্যাক্রোর
অর্থটি দেখুন
তবে দেখা যাবে, এই ম্যাক্রোটি আপনার ভাষা রানটাইম লাইব্রেরি সংস্করণের পছন্দ অনুসারে স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত হয়েছে।
আমি নির্ভর করি NDEBUG, কারণ একমাত্র তিনিই যার আচরণটি সংকলক এবং বাস্তবায়ন জুড়ে মানক করা হয় (স্ট্যান্ডার্ড জোর ম্যাক্রোর জন্য নথিপত্র দেখুন)। নেতিবাচক যুক্তি হ'ল একটি ছোট পাঠযোগ্যতার স্পিডবাম্প, তবে এটি একটি সাধারণ প্রতিভা যা আপনি তাড়াতাড়ি মানিয়ে নিতে পারেন।
এর মতো _DEBUGকোনও কিছুর উপর নির্ভর করা হ'ল একটি নির্দিষ্ট সংকলক এবং গ্রন্থাগার বাস্তবায়নের একটি বাস্তবায়নের বিশদের উপর নির্ভর করা। অন্যান্য সংকলক একই কনভেনশন চয়ন করতে বা নাও করতে পারে।
তৃতীয় বিকল্পটি হল আপনার প্রকল্পের জন্য আপনার নিজের ম্যাক্রো সংজ্ঞায়িত করা, যা যথেষ্ট যুক্তিসঙ্গত। আপনার নিজের ম্যাক্রো থাকা আপনাকে বাস্তবায়ন জুড়ে বহনযোগ্যতা দেয় এবং এটি আপনাকে নিজের ডিবাগিং কোডটিকে স্বতঃসংশ্লিষ্টভাবে স্বাধীন বা সক্ষম করতে দেয় to যদিও, সাধারণভাবে, আমি বিভিন্ন শ্রেণীর ডিবাগিং তথ্য সংকলনের সময়ে সক্ষম করার বিরুদ্ধে পরামর্শ দিই, কারণ এটি তর্কযোগ্যভাবে স্বল্প সুবিধার জন্য আপনার তৈরি কনফিগারেশনের সংখ্যা বাড়িয়ে তোলে (এবং পরীক্ষা)।
এই বিকল্পগুলির মধ্যে যে কোনওটির সাথে, আপনি যদি আপনার প্রকল্পের অংশ হিসাবে তৃতীয় পক্ষের কোড ব্যবহার করেন তবে আপনাকে কোন কনভেনশনটি ব্যবহার করে সে সম্পর্কে আপনাকে সচেতন হতে হবে।
#if !defined(NDEBUG)<- @ হোস্টাইলফোর্কে কি বোঝাতে চাইছেন না? #ifনা #ifdef?
#ifdef NDEBUG#if !defined(NDEBUG)#ifndef NDEBUG
বিবৃতিগুলি সক্রিয় NDEBUGকিনা তা ম্যাক্রো নিয়ন্ত্রণ করে assert()।
আমার দৃষ্টিতে, এটি অন্য কোনও ডিবাগিং থেকে পৃথক - সুতরাং আমি NDEBUGপ্রোগ্রামে ডিবাগিং তথ্য নিয়ন্ত্রণ করা ছাড়া অন্য কিছু ব্যবহার করি । আমি যে ফ্রেমওয়ার্কটি নিয়ে কাজ করছি তার উপর নির্ভর করে আমি যা ব্যবহার করি তা পরিবর্তিত হয়; বিভিন্ন সিস্টেমে বিভিন্ন সক্ষম ম্যাক্রোগুলি থাকে এবং আমি যা উপযুক্ত তা ব্যবহার করি।
যদি কোনও কাঠামো না থাকে তবে আমি একটি শীর্ষস্থানীয় আন্ডারস্কোর ছাড়াই একটি নাম ব্যবহার করব; এগুলি 'বাস্তবায়নে' সংরক্ষিত থাকে এবং আমি নাম সংঘর্ষের সমস্যাগুলি এড়াতে চেষ্টা করি - দ্বিগুণ তাই যখন নামটি ম্যাক্রো হয়।
#ifজোর দেওয়া এবং অন্যটিতে নিয়ন্ত্রিত কোডের মতো নয়। সম্ভবত না assert(huge_object.IsValid());হলেও ধীর হতে পারে assert(ptr != nullptr);। আমি জোনাথনের সাথে একমত যে লগিং এবং ট্রেসিং কমপক্ষে বড় প্রকল্পগুলিতে সম্ভবত দৃ as়তার সাথে পৃথক হওয়া উচিত, তবে আমি লগিং বা ডিবাগ কোড হিসাবে ট্রেসিংয়ের কথা ভাবি না , এ কারণেই আমি স্পষ্টতা চেয়েছিলাম।
দুর্ভাগ্যক্রমে DEBUGঅত্যধিক বোঝা হয়। উদাহরণস্বরূপ, রিলেস বিল্ডগুলির জন্য সর্বদা একটি পিডিবি ফাইল উত্পন্ন এবং সংরক্ষণ করার পরামর্শ দেওয়া হয়। যার অর্থ -Zxফ্ল্যাগগুলির একটি এবং -DEBUGলিঙ্কার বিকল্প। যদিও _DEBUGএই ধরনের কল হিসাবে রানটাইম লাইব্রেরির বিশেষ ডিবাগ সংস্করণ সম্পর্কিত mallocএবং free। তারপরে NDEBUGঅভিযোগগুলি অক্ষম করবে।