2011-01-14 34 views
5

ऐसी परियोजना के लिए डिज़ाइन संभावनाओं पर चर्चा करने में जिसमें बड़ी संख्या में स्थिरांक और बिट पैटर्न परिभाषित किए गए हैं, सवाल यह हुआ कि मानक डिस्प्लेर कितने # डिफाईन्स हैंडल कर सकते हैं? मुझे लगता है कि यह एक बहुत बड़ी संख्या है, लेकिन हम जानना उत्सुक थे कि वास्तविक ऊपरी सीमा है या नहीं।क्या #defines की संख्या की सीमा है कि जीसीसी और वीसी ++ प्रीप्रोसेसर संभाल सकते हैं?

उत्तर

7

एक "मानक संकलक" के लिए:

5.2.4.1: "अनुवाद सीमा"

कार्यान्वयन में सक्षम से अनुवाद कम से कम एक प्रोग्राम है जो कम से कम एक शामिल अमल हो सकता है और करेगा निम्नलिखित सीमा

में से हर एक का उदाहरण ...

4095 मैक्रो पहचानकर्ता एक साथ एक पूर्व प्रसंस्करण अनुवाद इकाई

नोट आवश्यकता phrasing का थोड़ा अजीब तरह से परिभाषित। कार्यान्वयन एक एकल "सुनहरा कार्यक्रम" करके इसे संतुष्ट कर सकता है जिसे वे एक विशेष मामले के रूप में पहचानते हैं और संकलित करते हैं, हालांकि यह बेंचमार्क को कम करने के समान होगा। अभ्यास में आप यह कहकर मानक पढ़ सकते हैं कि यदि आपका कार्यान्वयन उपलब्ध स्मृति के अलावा किसी सीमा को लागू करता है, तो उस सीमा को कम से कम 40 9 5 होना चाहिए। 40 9 5 से अधिक आप कार्यान्वयन-विशिष्ट व्यवहार पर निर्भर हैं।

कुछ कंपाइलर्स (माइक्रोसॉफ्ट) मानक कार्यान्वयन से कम कुछ कार्यान्वयन सीमा लगाते हैं। ये मुझे लगता है कि एमएसडीएन पर कहीं भी सूचीबद्ध हैं, लेकिन संभवतः केवल सी ++ के लिए। जहां तक ​​सी चला जाता है, क्योंकि मैं सी 99 उद्धृत कर रहा हूं, यह शायद एमएसवीसी के लिए प्रासंगिक नहीं हो सकता है।

विशेष रूप से जीसीसी और एमएसवीसी के लिए, यह जांचना बहुत कठिन नहीं होना चाहिए कि किसी दिए गए कार्यान्वयन को मनमाने ढंग से सीमा लागू होती है, शायद इसे दस्तावेज ढूंढने से कहीं अधिक आसान :-) फाइलों को ऑटो-जेनरेट करें, लेकिन #define की लंबी लंबी सूची , देखें कि प्रीप्रोसेसर क्या बनाता है।

+0

धन्यवाद। हां, मैं अंततः केवल जीन के लिए ऑटो-जेनरेट प्रयोग का प्रयास करूंगा ... –

2

मैंने कभी भी किसी के बारे में नहीं सुना है। कभी।

0

सी प्रीप्रोसेसर वास्तव में उपयोग किए जाने से पहले #define का विस्तार नहीं करता है। तो एक सामान्य कार्यान्वयन में आपको केवल एक ही सीमा का सामना करना पड़ सकता है जो कि सभी को स्टोर करने के लिए स्मृति है। लेकिन मैक्रोज़ के आंतरिक प्रतिनिधित्व को संग्रहीत करने के लिए यह स्मृति मूलतः उन फ़ाइलों के आकार के समान आनुपातिक होगी जो संकलक पढ़ता है।

(वैसे आप भी फाइलों के शामिल किए जाने के कर सकता है ...)

आप एक पूर्व प्रसंस्करण गहरा नीडिंत मैक्रो का विस्तार करके चलाने विस्फोट कर सकता है, मुझे लगता है।

#define EXP1(X) X X 
#define EXP2(X) EXP1(X) EXP1(X) 
#define EXP3(X) EXP2(X) EXP2(X) 
. 
. 
#define EXP64(X) EXP63(X) EXP63(X) 
EXP64(A) 

चाल चलाना चाहिए, क्योंकि यह आपको ए की 2^64 प्रतियां देता है, या तो। AFAIR, ये मैक्रो परिभाषाएं सीमाओं के भीतर भी हैं जो मानक लगाती हैं।

+0

"ये मैक्रो परिभाषाएं सीमाओं के भीतर भी हैं जो मानक लागू करती हैं" - लॉजिकल स्रोत लाइन में "40 9 5 वर्णों के भीतर इतना नहीं", मुझे लगता है कि प्रीप्रोकैसिंग के बाद लाइनों को संदर्भित किया जाता है। –

+0

@ स्टेव: मैक्रोज़ परिभाषाएं हैं, लेकिन उनमें से एक विस्तार नहीं है। लेकिन आप 'EXP() 'भी कर सकते हैं, फिर आसन्न व्हाइटस्पेस {sh | c | w} को एक साथ चिपकाया जा सकता है, और फिर भी संकलन विस्फोट हो जाएगा। –

+0

सहमत है, मानक में उल्लिखित विशिष्ट सीमाओं को तोड़ने के बिना प्रीप्रोसेसर/कंपाइलर को स्मृति से बाहर करना संभव है। –

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