_DEBUG বনাম NDEBUG


142

কোডের ডিবাগ বিভাগগুলি নির্দিষ্ট করতে কোন প্রিপ্রসেসর সংজ্ঞায়িত করা উচিত?

এটি করার আরও ভাল উপায় ব্যবহার করুন #ifdef _DEBUGবা #ifndef NDEBUGআছে কি #define MY_DEBUG?

আমার মনে _DEBUGহয় ভিজ্যুয়াল স্টুডিও সুনির্দিষ্ট, এনডিইবিউজি স্ট্যান্ডার্ড?

উত্তর:


113

ভিজুয়াল স্টুডিওটি সংজ্ঞা দেয় _DEBUGযখন আপনি বিকল্প /MTdবা /MDdবিকল্পটি নির্দিষ্ট করেন , NDEBUGস্ট্যান্ডার্ড-সি সংস্থান অক্ষম করে। উপযুক্ত হলে এগুলি ব্যবহার করুন, যেমন _DEBUGআপনি যদি নিজের ডিবাগিং কোডটি এমএস সিআরটি ডিবাগিং কৌশলগুলির সাথে সামঞ্জস্যপূর্ণ হন এবং NDEBUGআপনি যদি সামঞ্জস্য থাকতে চান তবে assert()

যদি আপনি নিজের ডিবাগিং ম্যাক্রোগুলি সংজ্ঞায়িত করেন (এবং আপনি সংকলক বা সি রানটাইম হ্যাক করেন না) তবে নামগুলি আন্ডারস্কোর দিয়ে শুরু করা এড়াবেন, কারণ এগুলি সংরক্ষিত রয়েছে।


19
+1 টি। বিশেষত NDEBUG কে একক টিউতে # অপরিশোধিত এবং # সংজ্ঞায়িত করার অনুমতি দেওয়া হয়েছে (এবং এর সাথে <assert.h> পুনরায় যোগ করা মেনে ম্যাক্রো অনুসারে পরিবর্তন করে)। এটি প্রত্যাশিত / কাঙ্ক্ষিতের চেয়ে আলাদা, কারণ এই উত্তরটি বলার সাথে সাথে "সংকলন-প্রশস্ত" ডিবাগ পতাকাটি নিয়ন্ত্রণ করতে অন্য ম্যাক্রো ব্যবহার করা সাধারণ।

1
স্পষ্টতই, এটি সংকলক নিজেই এই ম্যাক্রোগুলি সংজ্ঞা দেয় এবং ভিজ্যুয়াল স্টুডিও (আইডিই) নয়। এই উত্তরের জন্য অনেক ধন্যবাদ!
নিক্লাস আর

উইন্ডোজ ড্রাইভার কিট 8.1 থেকেও অ্যাপ্লিকেশন টেম্পলেট ব্যবহার করার সময় এনডিইবিউজি সংজ্ঞায়িত হয় না। এই ক্ষেত্রে, আপনাকে _DEBUG এর উপর নির্ভর করতে হতে পারে।
নাভোসোক

53

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 এর ম্যাক্রোর অর্থটি দেখুন তবে দেখা যাবে, এই ম্যাক্রোটি আপনার ভাষা রানটাইম লাইব্রেরি সংস্করণের পছন্দ অনুসারে স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত হয়েছে।


50

আমি নির্ভর করি NDEBUG, কারণ একমাত্র তিনিই যার আচরণটি সংকলক এবং বাস্তবায়ন জুড়ে মানক করা হয় (স্ট্যান্ডার্ড জোর ম্যাক্রোর জন্য নথিপত্র দেখুন)। নেতিবাচক যুক্তি হ'ল একটি ছোট পাঠযোগ্যতার স্পিডবাম্প, তবে এটি একটি সাধারণ প্রতিভা যা আপনি তাড়াতাড়ি মানিয়ে নিতে পারেন।

এর মতো _DEBUGকোনও কিছুর উপর নির্ভর করা হ'ল একটি নির্দিষ্ট সংকলক এবং গ্রন্থাগার বাস্তবায়নের একটি বাস্তবায়নের বিশদের উপর নির্ভর করা। অন্যান্য সংকলক একই কনভেনশন চয়ন করতে বা নাও করতে পারে।

তৃতীয় বিকল্পটি হল আপনার প্রকল্পের জন্য আপনার নিজের ম্যাক্রো সংজ্ঞায়িত করা, যা যথেষ্ট যুক্তিসঙ্গত। আপনার নিজের ম্যাক্রো থাকা আপনাকে বাস্তবায়ন জুড়ে বহনযোগ্যতা দেয় এবং এটি আপনাকে নিজের ডিবাগিং কোডটিকে স্বতঃসংশ্লিষ্টভাবে স্বাধীন বা সক্ষম করতে দেয় to যদিও, সাধারণভাবে, আমি বিভিন্ন শ্রেণীর ডিবাগিং তথ্য সংকলনের সময়ে সক্ষম করার বিরুদ্ধে পরামর্শ দিই, কারণ এটি তর্কযোগ্যভাবে স্বল্প সুবিধার জন্য আপনার তৈরি কনফিগারেশনের সংখ্যা বাড়িয়ে তোলে (এবং পরীক্ষা)।

এই বিকল্পগুলির মধ্যে যে কোনওটির সাথে, আপনি যদি আপনার প্রকল্পের অংশ হিসাবে তৃতীয় পক্ষের কোড ব্যবহার করেন তবে আপনাকে কোন কনভেনশনটি ব্যবহার করে সে সম্পর্কে আপনাকে সচেতন হতে হবে।


1
#if !defined(NDEBUG)<- @ হোস্টাইলফোর্কে কি বোঝাতে চাইছেন না? #ifনা #ifdef?
বব স্টেইন

1
আসল মন্তব্যটি @ObStein- এর মাধ্যমে সংশোধন করা হয়েছে: "পাঠযোগ্যতা" স্পিডবাম্প "প্রশমিত করার জন্য আমি কিছু করার#ifdef NDEBUG#if !defined(NDEBUG)#ifndef NDEBUG
হোস্টিলফোর্ক বলেছেন যে 21

17

বিবৃতিগুলি সক্রিয় NDEBUGকিনা তা ম্যাক্রো নিয়ন্ত্রণ করে assert()

আমার দৃষ্টিতে, এটি অন্য কোনও ডিবাগিং থেকে পৃথক - সুতরাং আমি NDEBUGপ্রোগ্রামে ডিবাগিং তথ্য নিয়ন্ত্রণ করা ছাড়া অন্য কিছু ব্যবহার করি । আমি যে ফ্রেমওয়ার্কটি নিয়ে কাজ করছি তার উপর নির্ভর করে আমি যা ব্যবহার করি তা পরিবর্তিত হয়; বিভিন্ন সিস্টেমে বিভিন্ন সক্ষম ম্যাক্রোগুলি থাকে এবং আমি যা উপযুক্ত তা ব্যবহার করি।

যদি কোনও কাঠামো না থাকে তবে আমি একটি শীর্ষস্থানীয় আন্ডারস্কোর ছাড়াই একটি নাম ব্যবহার করব; এগুলি 'বাস্তবায়নে' সংরক্ষিত থাকে এবং আমি নাম সংঘর্ষের সমস্যাগুলি এড়াতে চেষ্টা করি - দ্বিগুণ তাই যখন নামটি ম্যাক্রো হয়।


আপনি ব্যাখ্যা করতে পারেন যে আপনি কেন অন্য ধরণের ডিবাগিং থেকে পৃথক বলে বিবেচনা করছেন? কোন পরিস্থিতিতে আপনি একটি এবং অন্যটি চান না?
অ্যাড্রিয়ান ম্যাকার্থি

4
আমি কোডটিতে অন্যান্য ডিবাগিং বা ট্রেসিং সুবিধাগুলি সংকলন না করেও আমি দৃ active়ভাবে জোর দিয়েছি। জোর দিয়ে অসম্ভব পরিস্থিতি চিহ্নিত করে। সাধারণ ট্রেসিং এবং ডিবাগিং হ'ল আইএমও এর থেকে সম্পূর্ণ আলাদা।
জোনাথন লেফলার

2
@ অ্যাড্রিয়ানম্যাকার্থি: আপনার যদি সমস্ত ডিবাগিং সক্ষম করা থাকে তবে এটি প্রোগ্রামগুলি ধীরে ধীরে ক্রমবর্ধমানভাবে চালিত করতে পারে। সুতরাং ডিবাগিংয়ের ধরণগুলি শ্রেণীবদ্ধ করা এবং লোকেরা এগুলি পৃথকভাবে সক্ষম / অক্ষম করার মঞ্জুরি দেয় common এমএসভিসির দুটি বা তিনটি রয়েছে তারা স্ট্যান্ডার্ড :: ভেক্টরের মতো স্ট্যান্ডার্ড লাইব্রেরির জন্য বিভিন্ন ডিবাগিং সক্ষম / অক্ষম করতে ব্যবহার করে।
মাকিং হাঁস

@ মুভিংডাক: সম্মত, তবে 'ডিবাগিং উপলব্ধ এবং সক্ষম' এবং 'ডিবাগিং উপলব্ধ তবে অক্ষম' এবং 'ডিবাগিং উপলব্ধ নয়' এর মধ্যে পার্থক্য করুন। উপলভ্য / উপলভ্য সিদ্ধান্ত হ'ল একটি সংকলন সময় ইস্যু (সি বা সি ++ কোডে), এবং ডিবাগিং উপলব্ধ হলে সক্ষম / অক্ষম করা একটি রানটাইম সিদ্ধান্ত হয়। কেবল উপলব্ধ ক্রুডেস্ট ডিবাগিং সিস্টেমগুলি 'উপলভ্য উপায়গুলি সক্ষম' মোডের সাথে কাজ করে। (এটি বলেছিল, অশোধিত কার্যকর হতে পারে, এবং সেখানে প্রচুর পরিমাণে ক্রুড রয়েছে - তবে যথেষ্ট কার্যকর - সেখানে বন্য অঞ্চলে ডিবাগিং সিস্টেম রয়েছে!)
জোনাথন লেফলার

2
@ মুভিংডাক: হ্যাঁ, কিছু ডিবাগিং কোড ধীর হতে পারে। সেক্ষেত্রে ধীর কোডটি তুচ্ছ পরীক্ষাগুলি থেকে স্বাধীনভাবে চালিত হয় কিনা তা নিয়ন্ত্রণের কোনও উপায় আপনি চাইতে পারেন। তবে এটি একটি বিভাগে #ifজোর দেওয়া এবং অন্যটিতে নিয়ন্ত্রিত কোডের মতো নয়। সম্ভবত না assert(huge_object.IsValid());হলেও ধীর হতে পারে assert(ptr != nullptr);। আমি জোনাথনের সাথে একমত যে লগিং এবং ট্রেসিং কমপক্ষে বড় প্রকল্পগুলিতে সম্ভবত দৃ as়তার সাথে পৃথক হওয়া উচিত, তবে আমি লগিং বা ডিবাগ কোড হিসাবে ট্রেসিংয়ের কথা ভাবি না , এ কারণেই আমি স্পষ্টতা চেয়েছিলাম।
অ্যাড্রিয়ান ম্যাকার্থি

6

ধারাবাহিক হোন এবং এটি কোনটি বিবেচনা করে না। এছাড়াও যদি কোনও কারণে আপনাকে কোনও নির্দিষ্ট ডিইবিইউজি সনাক্তকারী ব্যবহার করে অন্য প্রোগ্রাম বা সরঞ্জামের সাথে আবশ্যক তবে এটি করা সহজ

#ifdef THEIRDEBUG
#define MYDEBUG
#endif //and vice-versa

4

দুর্ভাগ্যক্রমে DEBUGঅত্যধিক বোঝা হয়। উদাহরণস্বরূপ, রিলেস বিল্ডগুলির জন্য সর্বদা একটি পিডিবি ফাইল উত্পন্ন এবং সংরক্ষণ করার পরামর্শ দেওয়া হয়। যার অর্থ -Zxফ্ল্যাগগুলির একটি এবং -DEBUGলিঙ্কার বিকল্প। যদিও _DEBUGএই ধরনের কল হিসাবে রানটাইম লাইব্রেরির বিশেষ ডিবাগ সংস্করণ সম্পর্কিত mallocএবং free। তারপরে NDEBUGঅভিযোগগুলি অক্ষম করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.