উত্তর:
Cppreference.com পৃষ্ঠার পদ বলে:
সমস্ত ম্যাক্রো প্রসারিত এবং নির্ধারিত এবং __হাস_ইনক্লিন্ড (সি ++ 17) প্রকাশের মূল্যায়নের পরে, কোনও বুলিয়ান আক্ষরিক নয় এমন কোনও শনাক্তকারীকে 0 নম্বর দিয়ে প্রতিস্থাপন করা হবে (এতে শনাক্তকারীগুলি অন্তর্ভুক্ত রয়েছে যা বর্ণবাদী কীওয়ার্ড, তবে বিকল্প টোকেনগুলি পছন্দ করে না এবং )।
সুতরাং উভয় foo
এবং bar
0 দিয়ে প্রতিস্থাপিত হয়।
একটি #if
বিবৃতিতে, কোনও সনাক্তকারী যা ম্যাক্রো প্রতিস্থাপনের পরে অবধি থাকে (বাদে true
এবং ব্যতীত false
) ধ্রুবক দ্বারা প্রতিস্থাপিত হয় 0
। সুতরাং আপনার নির্দেশিকা হয়ে যায়
#if 0 == 0
কোনটা সত্য.
এর কারণ তন্ন তন্ন foo
না bar
কোন সংজ্ঞা বা মূল্য দেওয়া হয়েছে - তাই তারা একই (অর্থাত একটি "0" মান প্রয়োগ করা হবে)। সংকলকগণ এ সম্পর্কে সতর্কতা দেবেন।
MSVC
কম্পাইলার (ভিসুয়াল স্টুডিও 2019) নিম্নলিখিত দেয়:
সতর্কতা C4668: 'foo' প্রিপ্রোসেসর ম্যাক্রো হিসাবে সংজ্ঞায়িত করা হয়নি, '# যদি / #
এলিফ ' সতর্কতা C4668: 'বার' প্রিপ্রসেসর ম্যাক্রো হিসাবে সংজ্ঞায়িত করা হয় না তবে '0' এর পরিবর্তে '#' / # Elif '
সুতরাং VALUE
মান '0' (এর জন্য ডিফল্ট foo
) দেওয়া হয় এবং bar
' VALUE == bar
0'ও রয়েছে , সুতরাং "সত্য" এ মূল্যায়ন করুন।
একইভাবে, clang-cl
নিম্নলিখিত দেয়:
সতর্কতা: 'foo' সংজ্ঞায়িত করা হয় না, 0 [-উন্ডফ]
সতর্কতার জন্য মূল্যায়ন করে : 'বার' সংজ্ঞায়িত হয় না, 0 -কে মূল্যায়ন করে [-উন্ডফ]
MSVC
এবং clang-cl
সংকলকগুলির সাথেও , এই সতর্কতা অক্ষম করা যেতে পারে (হয় বিশেষভাবে, বা একটি উপযুক্ত সতর্কতা 'স্তর' সেট করে)।
আপনার পরে যা আছে তা অর্জন করতে, এটি চেষ্টা করুন:
#include <iostream>
#define DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
এই ক্ষেত্রে আপনি ডিবাগিং স্টেটমেন্টগুলি "সংজ্ঞায়িত" কে "অপরিবর্তিত" পরিবর্তন করে বন্ধ করতে পারেন।
#include <iostream>
#undef DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
আপনি দেখতে পাচ্ছেন যে আপনার সংকলক আপনাকে কোডের বাইরেই ডিইবিইউজি সংজ্ঞায়িত করার অনুমতি দেয়, সেই সময়ে আপনি কোডটি হ্রাস করতে পারবেন
#include <iostream>
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
এবং তারপরে একটি বিকল্প যেমন -DDEBUG = 0 এর সাথে সংকলককে অনুরোধ করুন
স্টিভ ম্যাককনেলের ডিফেন্সিভ প্রোগ্রামিং সম্পর্কিত অধ্যায়টি দেখুন, "কোড সম্পূর্ণ।"