উত্তর:
আমি যে হ্যাকের চারপাশে দেখেছি তা হ'ল &&
অপারেটরটি ব্যবহার করা । যেহেতু একটি পয়েন্টারটি "সত্য" যদি এটি অকার্যকর হয় তবে আপনি শর্তটি পরিবর্তন না করে নিম্নলিখিতটি করতে পারেন:
assert(a == b && "A is not equal to B");
যেহেতু assert
ব্যর্থ হওয়া শর্তটি দেখায় তাই এটি আপনার বার্তাটিও প্রদর্শন করবে। যদি এটি পর্যাপ্ত না হয় তবে আপনি নিজের myAssert
ফাংশন বা ম্যাক্রো লিখতে পারেন যা আপনি যা চান তা প্রদর্শন করবে।
assert(("A must be equal to B", a == b));
assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
printf
যদি কোনও মুদ্রণ করে তবে একটি শূন্য-না-মান দেয়, যাতে আপনি এমন কিছু করতে পারেন assert(a == b && printf("a (%i) is not equal to b (%i)", a, b))
, যদিও সেই সময়ে আপনার সম্ভবত নিজের নিজের দাবির মোড়ক লিখতে হবে।
অপরটি বিকল্পগুলি অপারেশনগুলিকে বিপরীত করা এবং কমা অপারেটরটি ব্যবহার করা। আপনার অতিরিক্ত বন্ধনী প্রয়োজন তাই আর্গুমেন্টগুলির মধ্যে কমাটি সীমানা হিসাবে বিবেচিত হবে না:
assert(("A must be equal to B", a == b));
(আরও ভাল দৃশ্যমানতার জন্য এটি উপরের মন্তব্যগুলি থেকে অনুলিপি করা হয়েছিল)
#define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
এখানে আমার দাবী ম্যাক্রোর সংস্করণ রয়েছে, যা বার্তাটি গ্রহণ করে এবং সবকিছু পরিষ্কার করে প্রিন্ট করে:
#include <iostream>
#ifndef NDEBUG
# define M_Assert(Expr, Msg) \
__M_Assert(#Expr, Expr, __FILE__, __LINE__, Msg)
#else
# define M_Assert(Expr, Msg) ;
#endif
void __M_Assert(const char* expr_str, bool expr, const char* file, int line, const char* msg)
{
if (!expr)
{
std::cerr << "Assert failed:\t" << msg << "\n"
<< "Expected:\t" << expr_str << "\n"
<< "Source:\t\t" << file << ", line " << line << "\n";
abort();
}
}
এখন, আপনি এটি ব্যবহার করতে পারেন
M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");
এবং ব্যর্থতার ক্ষেত্রে আপনি এই জাতীয় বার্তা পাবেন:
জোর দেওয়া ব্যর্থ: মাই ফাংশন: নন-নাল আর্গুমেন্টের প্রয়োজন
প্রত্যাশিত: ptr! = Nullptr
উত্স: সি: \ মাইপ্রজেক্ট \ src.cpp, লাইন 22
সুন্দর এবং পরিষ্কার, এটিকে আপনার কোডে ব্যবহার করতে নির্দ্বিধায় =)
x == y
। তারপরে Expr এর মধ্যে প্রসারিত হবে if( !(x == y))
এবং এখানেই শর্তটি পরীক্ষা করা হবে এবং #Expr স্ট্রিং লিটারে প্রসারিত হবে "x == y"
, যা আমরা ত্রুটি বার্তায় রেখেছি ।
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
আপনি এটি সরাসরি ব্যবহার করতে পারেন বা বুস্টের কোডটি অনুলিপি করতে পারেন। এছাড়াও নোট করুন বুস্ট দৃ as়পদ কেবলমাত্র শিরোনাম, সুতরাং আপনি সমস্ত বুস্ট ইনস্টল করতে না চাইলে আপনি কেবলমাত্র সেই একক ফাইলটি দখল করতে পারেন।
জিনাকের উত্তর কোডটি কিছুটা বিশৃঙ্খলাবদ্ধ করার সাথে সাথে, আপনি যে স্ট্রিংয়ের পাঠ্যটির কথা বলছেন তা কেবল মন্তব্য করা আরও ভাল উপায়। অর্থাত .:
assert(a == b); // A must be equal to B
যেহেতু দৃ error়তা ত্রুটির পাঠক ত্রুটি বার্তা থেকে যেভাবেই ফাইল এবং লাইন সন্ধান করবেন, তারা এখানে সম্পূর্ণ ব্যাখ্যা দেখতে পাবেন।
কারণ, দিন শেষে, এটি:
assert(number_of_frames != 0); // Has frames to update
এর চেয়ে ভাল পড়া:
assert(number_of_frames != 0 && "Has frames to update");
কোড যেমন মানুষের পার্সিং শর্তাবলী। পাঠযোগ্যতা। এছাড়াও একটি ভাষা হ্যাক নয়।
জোড় করা একটি ম্যাক্রো / ফাংশন সমন্বয়। আপনি, আপনার নিজের ম্যাক্রো / ফাংশন নির্ধারণ ব্যবহার করতে পারেন __FILE__
, __BASE_FILE__
, __LINE__
আপনার নিজের ফাংশন যা একটি বার্তা লিখে নেয় সঙ্গে, ইত্যাদি