2012-11-14 21 views
5

मुझे पता है कि इस कोड को दोनों सी और सी में मान्य है ++:मैक्रो परिभाषा और सी ++

#define FOO 0 
#define FOO 0 

आईएसओ/आईईसी 14882: 2011

16,3 मैक्रो प्रतिस्थापन [cpp.replace ]

2 वर्तमान में किसी ऑब्जेक्ट-जैसे मैक्रो के रूप में परिभाषित एक पहचानकर्ता किसी अन्य # परिभाषित प्रीप्रोकैसिंग निर्देश द्वारा पुन: परिभाषित किया जा सकता है बशर्ते सेकंड ऑनड परिभाषा एक ऑब्जेक्ट जैसी मैक्रो परिभाषा है और दो प्रतिस्थापन सूचियां समान हैं, अन्यथा कार्यक्रम खराब है। इसी तरह, एक पहचानकर्ता वर्तमान में एक समारोह की तरह मैक्रो के रूप में परिभाषित एक और #define पूर्व प्रसंस्करण प्रदान की है कि दूसरी परिभाषा एक समारोह की तरह मैक्रो परिभाषा एक ही नंबर और मानकों की वर्तनी है कि निर्देश के द्वारा नए सिरे से परिभाषित किया जा सकता है, और दो प्रतिस्थापन सूची समान हैं, अन्यथा कार्यक्रम खराब है।

लेकिन इस कोड के बारे में क्या?

#define FOO 0 
#define FOO FOO 

रिप्लेसमेंट सूचियों preprocessing (केवल जब पहली प्रतिस्थापन होता है) के शुरू में समान नहीं हैं।

+0

यह मेरे लिए एक बुरा दृष्टिकोण जैसा लगता है। भावी डेवलपर्स द्वारा भ्रम और संभावित त्रुटियों का कारण बनने की संभावना है। –

+1

@ जोनाथन वुड मैं इसे वास्तविक कोड में उपयोग नहीं करना चाहता, बस दिलचस्प पल – FrozenHeart

उत्तर

6

या तो सी या सी ++ में इसकी अनुमति नहीं है। प्रतिस्थापन सूची समान होना चाहिए। आप किस बारे में बात कर रहे हैं (पहले पास के बाद) प्रतिस्थापन सूची को प्रतिस्थापित करने का नतीजा है, न कि प्रतिस्थापन सूची स्वयं। चूंकि प्रतिस्थापन सूची स्वयं समान नहीं है, इसलिए कोड की अनुमति नहीं है।


या कम से कम अगर पूर्वप्रक्रमक एक खास तरह से है कि यह वास्तव कैसे करता है से अलग होने वाला काम किया क्या परिणाम होगा।

+1

दूसरे शब्दों में, रिक्त स्थान के संभावित अपवाद के साथ, दाएं हाथ की तरफ टोकन का एक ही अनुक्रम होना चाहिए। –

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