2012-03-10 12 views
5

संकलक विशिष्ट कोड के लिए, यह इस तरह के रूप सीपीपी निर्देशों दिखाई देना सामान्य है:सी पूर्वप्रक्रमक मैक्रो परिभाषा बनाम मूल्य पोर्टेबिलिटी और अभ्यास

#if defined (__GNUC__) && (__GNUC__ >= 4)

जो पूर्वप्रक्रमक परीक्षण मैं आमतौर पर उपयोग है - नहीं के लिए विशेष रूप __GNUC__, लेकिन यह एक आम उदाहरण है। वैकल्पिक रूप से,

#if (__GNUC__ >= 4)

एक ही आवश्यकताओं को पूरा करना प्रतीत होता है। क्या उत्तरार्द्ध के साथ संभावित समस्याएं हैं? न केवल जीसीसी के साथ, बल्कि किसी मानक-अनुरूप प्रीप्रोसेसर। क्या एलएचएस का मूल्यांकन एक निश्चित मूल्य के रूप में किया जा सकता है, भले ही इसे परिभाषित न किया जाए? क्या दूसरे दृष्टिकोण के लिए कोई समस्या है कि किसी भी भाषा वकील के बारे में पता है?

उत्तर

5

प्रीप्रोसेसर मानदंडों में मान 0 मानने के लिए अपरिभाषित मैक्रोज़ मानता है, इसलिए इस मामले में आपका सरलीकरण ठीक है। यदि आप जीसीसी में 4 से कम संस्करण के खिलाफ जांचना चाहते हैं, तो आपको परेशानी हो सकती है हालांकि यह true के रूप में < के साथ मूल्यांकन करेगा, भले ही यह gcc नहीं है।

मुझे लगता है कि दोनों उपयोग करने का कारण भी understandability का सवाल है, यदि आप

#if defined(__GNUC__) && (__GNUC>=4) 

जाँच यह बजाय स्पष्ट है आप कोड के साथ एक ब्लॉक है कि केवल जीसीसी के लिए है में पहले से ही नहीं कर रहे हैं, जबकि सरलीकरण

#if (__GNUC__ >= 4) 

कि स्पष्ट नहीं है और केवल जब आप पहले से ही पता है कि यह जीसीसी है एक संस्करण की जांच के रूप में पढ़ा जा सकता है।

+0

बिल्कुल सहमत हैं कि पहली पसंद बेहतर है क्योंकि इससे इरादा अधिक स्पष्ट हो जाता है, और कुछ भी लागत नहीं होती है। यह संभावित रूप से गलत 'फॉल-थ्रू' से भी बचाता है जहां एकाधिक कंपाइलर/प्लेटफार्म मामलों का मूल्यांकन किया जाता है। –

2

GNUC मामले में, जब आप इसे दूसरी तरह के आसपास का परीक्षण कर रहे हैं, यह गलत बात करेंगे:

#if (__GNUC__ < 4) 

मुझे लगता है कि यह एक सच हो जाएगा, भले ही GNUC परिभाषित नहीं है।

+1

+1, अच्छा काउंटर उदाहरण। –

संबंधित मुद्दे