2016-07-21 19 views
5

इस समस्या को ठीक करने का प्रयास कर रहा है: C++ How can I prevent my team developers from using integer version of abs by mistake? मैक्रो का उपयोग करके abs फ़ंक्शन अब उपयोग करने योग्य नहीं है।प्रीप्रोसेसर स्टेटमेंट का उपयोग करके मानक फ़ंक्शन को वर्जित नहीं किया जा सकता है?

अगर मैं जी के साथ myabs(3); युक्त एक कोड ++ विकल्प -Dmyabs=abs यह संकलित (myabsabs द्वारा प्रतिस्थापित किया जा) संकलन है, ठीक है।

अब, अगर मैं जी के साथ abs(3); युक्त एक कोड ++ विकल्प -Dabs=forbidden यह भी संकलित ... कारण है कि यह रिपोर्ट नहीं करता कि forbidden अज्ञात है संकलन? ऐसा लगता है कि abs को प्री-प्रोसेसिंग के दौरान forbidden द्वारा प्रतिस्थापित नहीं किया गया है ... क्यों?

उत्तर

1

ऐसा लगता है कि पूर्व प्रसंस्करण के दौरान abs द्वारा प्रतिस्थापित नहीं किया गया है ... क्यों?

// Get rid of those macros defined in <math.h> in lieu of real functions. 
#undef abs 
#undef div 
// ... 

आपका हेडर ही बात कर किया जा सकता है:

कम से कम मानक पुस्तकालय है कि मैं (libstdC++) जो ::abs परिभाषित का उपयोग अपने मैक्रो हेडर, undefine। इस तरह के अनिश्चितता को देखते हुए, प्रीप्रोसेसर मैक्रो का उपयोग करके इस तरह के फ़ंक्शन को प्रतिबंधित करना वास्तव में असंभव है।

+0

यदि इसमें गार्ड शामिल हैं, तो इसमें शामिल हैं, आप शामिल किए गए सेमीथ कंपाइलर तर्क के साथ इसके समावेश को मजबूर कर सकते हैं, फिर पेट मैक्रो (अनचाहे) – matt

+0

को परिभाषित करें अच्छा जवाब: 'गणित' को शामिल करने से पहले 'abs' को' वर्जित 'द्वारा प्रतिस्थापित किया गया है, इसके बाद नहीं, इसलिए किसी को '#undef abs' करना होगा – jpo38

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

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