जवाबों:
Cppreference.com पर पेज कहता है:
परिभाषित और __has_include (C ++ 17 के बाद से) के सभी मैक्रो विस्तार और मूल्यांकन के बाद, कोई भी पहचानकर्ता जो बूलियन शाब्दिक नहीं है उसे नंबर 0 से बदल दिया जाता है (इसमें ऐसे पहचानकर्ता शामिल हैं जो शाब्दिक कीवर्ड हैं, लेकिन वैकल्पिक टोकन जैसे और )।
दोनों तो fooऔर bar0 से बदला जाता है।
एक में #ifबयान, किसी भी पहचानकर्ता कि मैक्रो प्रतिस्थापन (के अलावा के बाद बनी हुई है trueऔर false) लगातार बदल दिए जाते हैं 0। तो आपका निर्देशन बन जाता है
#if 0 == 0
कौन सा सही है।
इसका कारण यह है न fooहै और न ही barकिसी भी परिभाषा या मूल्य दिया गया है - तो वे ही कर रहे हैं (यानी एक "0" मान से बदल)। कंपाइलर्स इस बारे में चेतावनी देंगे।
MSVCसंकलक (विजुअल स्टूडियो -2019) निम्नलिखित देता है:
चेतावनी C4668: 'foo' को प्रीप्रोसेसर मैक्रो के रूप में परिभाषित नहीं किया गया है, '#' के लिए '#' के स्थान पर # if / #
एलिफ ' चेतावनी C4668:' बार 'को प्रीप्रोसेसर मैक्रो के रूप में परिभाषित नहीं किया गया है,' # 'के लिए' 0 'की जगह / # elif '
तो VALUEमूल्य '0' दिया गया है (डिफ़ॉल्ट के लिए foo) और barभी '0' है, इसलिए VALUE == bar"TRUE।" का मूल्यांकन करता है।
इसी तरह, clang-clनिम्नलिखित देता है:
चेतावनी: 'फू' को परिभाषित नहीं किया गया है, 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
}
आप पा सकते हैं कि आपका संकलक आपको कोड के बाहर DEBUG को परिभाषित करने की अनुमति देता है, जिस बिंदु पर आप कोड को कम कर सकते हैं
#include <iostream>
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
और फिर कम्पाइलर को एक विकल्प जैसे -DDEBUG = 0 से आह्वान करें
स्टीव मैककोनेल में रक्षात्मक प्रोग्रामिंग के अध्याय को देखें, "कोड कम्प्लीट।"