জোড়ায় কাস্টম বার্তা যুক্ত করবেন?


129

দৃ by়ভাবে ছুঁড়ে দেওয়া বার্তাটি যুক্ত করার বা সম্পাদনা করার কোনও উপায় আছে কি? আমি এর মতো কিছু ব্যবহার করতে চাই

assert(a == b, "A must be equal to B");

তারপরে, সংকলক লাইন , সময় এবং আরও যোগ করে ...

এটা কি সম্ভব?


আপনি এই জাতীয় ম্যাক্রো সংজ্ঞায়িত করতে পারেন ।
হ্যালো গুডবাই

উত্তর:


240

আমি যে হ্যাকের চারপাশে দেখেছি তা হ'ল &&অপারেটরটি ব্যবহার করা । যেহেতু একটি পয়েন্টারটি "সত্য" যদি এটি অকার্যকর হয় তবে আপনি শর্তটি পরিবর্তন না করে নিম্নলিখিতটি করতে পারেন:

assert(a == b && "A is not equal to B");

যেহেতু assertব্যর্থ হওয়া শর্তটি দেখায় তাই এটি আপনার বার্তাটিও প্রদর্শন করবে। যদি এটি পর্যাপ্ত না হয় তবে আপনি নিজের myAssertফাংশন বা ম্যাক্রো লিখতে পারেন যা আপনি যা চান তা প্রদর্শন করবে।


27
অপরটি বিকল্পগুলি অপারেশনগুলিকে বিপরীত করা এবং কমা অপারেটর ব্যবহার করা। আপনার অতিরিক্ত বন্ধনী প্রয়োজন তাই আর্গুমেন্টগুলির মধ্যে কমাটি সীমানা হিসাবে বিবেচিত হবে না:assert(("A must be equal to B", a == b));
কিথ থম্পসন

3
ভেরিয়েবলের মানগুলি মুদ্রণ করতে সক্ষম হওয়া ভাল লাগবে, যেমন:assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
ফ্রাঙ্ক

7
@ ফ্র্যাঙ্ক, printfযদি কোনও মুদ্রণ করে তবে একটি শূন্য-না-মান দেয়, যাতে আপনি এমন কিছু করতে পারেন assert(a == b && printf("a (%i) is not equal to b (%i)", a, b)), যদিও সেই সময়ে আপনার সম্ভবত নিজের নিজের দাবির মোড়ক লিখতে হবে।
জিনাক করুন

1
খারাপ কোড! আমি এটা বুঝতে পারি না! যদি একটি == বি মিথ্যা হয়, এবং-এক্সপ্রেশনটিও মিথ্যা হওয়া উচিত এবং অতএব, স্ট্রিংটির মূল্যায়ন করা উচিত নয়।
রাগেরিয়াস

1
@ টিউআইওভার, সি স্ট্রিং লিটারেলগুলি এভাবে কাজ করে না; তারা সংকলন-সময় ধ্রুবক এবং এই প্রসঙ্গে তাদের ব্যবহার তুচ্ছভাবে অপ্টিমাইজড হয়। কোনও রানটাইম ব্যয় নেই।
জিনাক করুন

45

অপরটি বিকল্পগুলি অপারেশনগুলিকে বিপরীত করা এবং কমা অপারেটরটি ব্যবহার করা। আপনার অতিরিক্ত বন্ধনী প্রয়োজন তাই আর্গুমেন্টগুলির মধ্যে কমাটি সীমানা হিসাবে বিবেচিত হবে না:

assert(("A must be equal to B", a == b));

(আরও ভাল দৃশ্যমানতার জন্য এটি উপরের মন্তব্যগুলি থেকে অনুলিপি করা হয়েছিল)


3
এটি একটি দুর্দান্ত পদ্ধতির, একটি ক্ষুদ্র ইস্যু সহ এটি "সতর্কতা প্রদর্শন করবে: কমা অপারেটরের বাম অপারেন্ডের কোনও প্রভাব নেই" g -Wused- মান
v010dya

1
বা ম্যাক্রো সঙ্গে #ifndef m_assert # define m_assert (expr, Msg) জাহির ((বার্তা, expr)) #endif
Szymon Marczak

ম্যাক্রো মোড়ক ব্যবহারের ফলে আপনাকে #define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
সিসি

25

এখানে আমার দাবী ম্যাক্রোর সংস্করণ রয়েছে, যা বার্তাটি গ্রহণ করে এবং সবকিছু পরিষ্কার করে প্রিন্ট করে:

#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

সুন্দর এবং পরিষ্কার, এটিকে আপনার কোডে ব্যবহার করতে নির্দ্বিধায় =)


সুন্দর. খুব দরকারী
কিলরাজোর

আমি একটু বিভ্রান্ত # এক্সপ্রেসকে প্রত্যক্ষ প্রতিস্থাপনের স্ট্রিং হিসাবে বিবেচনা করা হয়? # এক্সপ্রেস এবং এক্সপ্রেসের মধ্যে পার্থক্য কী?
মিন ট্রান

@ মিনিট্রান আসুন ধরে নেওয়া যাক আপনার দৃsert় শর্তটি x == y। তারপরে Expr এর মধ্যে প্রসারিত হবে if( !(x == y))এবং এখানেই শর্তটি পরীক্ষা করা হবে এবং #Expr স্ট্রিং লিটারে প্রসারিত হবে "x == y", যা আমরা ত্রুটি বার্তায় রেখেছি ।
ইউজিন ম্যাগডালিটস

দুর্ভাগ্যক্রমে, এই সমাধানটি সংরক্ষিত শনাক্তকারীদের ব্যবহারের কারণে অনির্ধারিত আচরণের কারণ হয়।
মনিকা

19
BOOST_ASSERT_MSG(expre, msg)

http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html

আপনি এটি সরাসরি ব্যবহার করতে পারেন বা বুস্টের কোডটি অনুলিপি করতে পারেন। এছাড়াও নোট করুন বুস্ট দৃ as়পদ কেবলমাত্র শিরোনাম, সুতরাং আপনি সমস্ত বুস্ট ইনস্টল করতে না চাইলে আপনি কেবলমাত্র সেই একক ফাইলটি দখল করতে পারেন।


@ জিচাও, দৃsert় ইন্টারফেসটি প্রয়োগ করে আপনার অর্থ কী?
তারাক

7

জিনাকের উত্তর কোডটি কিছুটা বিশৃঙ্খলাবদ্ধ করার সাথে সাথে, আপনি যে স্ট্রিংয়ের পাঠ্যটির কথা বলছেন তা কেবল মন্তব্য করা আরও ভাল উপায়। অর্থাত .:

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");

কোড যেমন মানুষের পার্সিং শর্তাবলী। পাঠযোগ্যতা। এছাড়াও একটি ভাষা হ্যাক নয়।


1
"যেহেতু দৃ error়তা ত্রুটির পাঠক ত্রুটি বার্তা থেকে যেভাবেই ফাইল এবং লাইন সন্ধান করবেন," - তবে তারা যদি পরিশ্রমী হয়।
জেসন এস

কেবলমাত্র যদি তারা বাগটি ঠিক করতে চান তবে আপনি কী বোঝাতে চাইছেন ... কী নির্বোধ মন্তব্য
রূপান্তর

1
না। সমস্যাটি লোকেদের পক্ষে দেখার পক্ষে আপনি যত সহজ করবেন তত বেশি তত দ্রুত তারা পদক্ষেপ নেবে।
জেসন এস

মতামত গ্রহণ করুন
রূপান্তর

2

জোড় করা একটি ম্যাক্রো / ফাংশন সমন্বয়। আপনি, আপনার নিজের ম্যাক্রো / ফাংশন নির্ধারণ ব্যবহার করতে পারেন __FILE__, __BASE_FILE__, __LINE__আপনার নিজের ফাংশন যা একটি বার্তা লিখে নেয় সঙ্গে, ইত্যাদি


-6

ভিসির জন্য, assert.h এ নিম্নলিখিত কোড যুক্ত করুন,

#define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )

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