मानक सी (सी 8 9, सी 99 या सी 11) द्वारा परिभाषित सुविधाओं का उपयोग करके, केवल 'अक्षम' तंत्र #undef
है।
समस्या यह है कि कोई 'पुनः सक्षम' तंत्र नहीं है।
के रूप में अन्य लोगों, ने बताया है अगर हैडर मैक्रो परिभाषाओं युक्त फ़ाइल (इन दोहराया नहीं जा सकता; समारोह और चर घोषणाओं दोहराया जा सकता है) संरचित है इतना है कि यह किसी भी typedef या enum में घोषणा-पत्र नहीं है, तो आप #undef
मैक्रो कर सकते हैं, मैक्रो के प्रभाव के बिना आपको जो चाहिए वह करें, और उसके बाद हेडर को दोबारा शामिल करें, संभवतः पुन: समावेशन के खिलाफ अपनी सुरक्षा को परिभाषित करने के बाद।
यदि मैक्रोज़ को हेडर में परिभाषित नहीं किया गया है, तो निश्चित रूप से, आप तब तक अटक जाते हैं जब तक आप कोड को दोबारा नहीं कर देते ताकि वे शीर्षलेख में हों।
एक अन्य चाल उपलब्ध है - यदि मैक्रोज़ मैक्रोज़ की तरह कार्य करता है और मैक्रोज़ की तरह ऑब्जेक्ट नहीं होता है।
#define nonsense(a, b) b /\= a
int (nonsense)(int a, int b)
{
return (a > b) ? a : b;
}
समारोह nonsense()
ठीक परिभाषित किया गया है, उसे तुरंत पहले मैक्रो के बावजूद। ऐसा इसलिए है क्योंकि एक मैक्रो इनवोकेशन - फ़ंक्शन-जैसे मैक्रो के लिए - तुरंत खुले कोष्ठक द्वारा पीछा किया जाना चाहिए (सफेद जगह दें या संभवतः टिप्पणियों सहित) लेना चाहिए। फ़ंक्शन परिभाषा रेखा में, 'बकवास' के बाद टोकन एक करीबी कोष्ठक है, इसलिए यह nonsense
मैक्रो का आविष्कार नहीं है।
था मैक्रो एक तर्क-कम वस्तु की तरह मैक्रो किया गया, चाल काम नहीं होगा:
#define nonsense min
int (nonsense)(int a, int b)
{
// Think about it - what is the function really called?
return (a > b) ? a : b;
}
इस कोड को एक फर्जी समारोह है कि min
कहा जाता है और अतर्कसंगत है है परिभाषित करता है। और मैक्रो से कोई सुरक्षा नहीं है।
यह एक कारण है कि मानक परिभाषित करने के लिए मानक क्यों है कि नामांकन 'कार्यान्वयन' के लिए आरक्षित हैं। कार्यान्वयन को किसी भी प्रकार (कार्य-जैसी या वस्तु जैसी) की इच्छाओं या आवश्यकताओं के किसी भी उद्देश्य के लिए मैक्रोज़ को परिभाषित करने की अनुमति है, बशर्ते वे नाम कार्यान्वयन के लिए आरक्षित हों। यदि आप कार्यान्वयन की सेवाओं के उपभोक्ता के रूप में कार्यान्वयन के लिए आरक्षित नाम का उपयोग या परिभाषित करने का प्रयास करते हैं, तो आपको अवगत होना चाहिए कि आपका कोड शायद जल्दी या बाद में टूट जाएगा, और यह आपकी गलती होगी, न कि गलती क्रियान्वयन।
मुझे लगता है कि वास्तव में इस मैक्रो गड़बड़ी में समाप्त होने के लिए आपके पास एक ठोस कारण है? मैं यहां एक के बारे में नहीं सोच सकता ... – sbi