2013-01-31 36 views
21

मुझे सी में प्रोग्रामिंग में कुछ अनुभव है लेकिन मैं खुद को कुशल कहने की हिम्मत नहीं करता।सी मैक्रोज़: स्पष्ट रूप से बेकार मैक्रो का लाभ/इरादा

#define CONST(x) (x) 

मैं यह आम तौर पर की तरह उदाहरण के लिए भाव में इस्तेमाल किया लगता है:

double x, y; 
x = CONST(2.0)*y; 

पूरी तरह से इस मैक्रो की बात से विस्मित कर, मैं बड़े पैमाने पर लाभ/नुकसान शोध हाल ही में, मैं निम्नलिखित मैक्रो का सामना करना पड़ा और मैक्रोज़ के गुण लेकिन फिर भी मैं यह नहीं समझ सकता कि इस विशेष मैक्रो का उपयोग क्या होगा। क्या मैं कुछ भूल रहा हूँ?

+2

यह मैक्रो कुछ भी प्राप्त नहीं करता है, शायद एक दृश्य अनुस्मारक के अलावा कि कुछ स्थिर है ... –

+2

ऐसा करने का एकमात्र कारण यह है कि बाहरी उपकरण को प्रोग्राम में विशिष्ट स्थिरांक आसानी से ढूंढने की अनुमति होगी । इसका प्रयोग टेक्स्ट को कभी-कभी अनुवादित करने के लिए किया जाता है, हालांकि मुझे यकीन नहीं है कि यह कैसे मदद करेगा – jcoder

+2

और यह इसे खोजने योग्य – Minthos

उत्तर

11

जैसा कि प्रश्न में प्रस्तुत किया गया है, आप सही हैं कि मैक्रो कुछ भी नहीं करता है।

ऐसा लगता है कि जो भी कोड लिखा है, द्वारा लगाए गए कुछ कृत्रिम ढांचे की तरह दिखता है, शायद यह स्पष्ट रूप से स्पष्ट करने के लिए कि स्थिरांक कहां हैं, और उन्हें खोजने में सक्षम हैं? मैं खोजने योग्य स्थिरांक रखने में लाभ देख सकता था, लेकिन यह लक्ष्य प्राप्त करने का यह सबसे अच्छा तरीका नहीं है।

यह भी संभव है कि यह किसी अन्य मैक्रो योजना का हिस्सा था जिसे या तो कभी लागू नहीं किया गया था या केवल आंशिक रूप से हटा दिया गया था।

+1

+1 बनाता है, यह केवल एकमात्र चीज है जिसे मैं इसके बारे में भी सोच सकता हूं। –

+5

वह सचेत नहीं है, एक सेन प्रोग्रामर "जादू संख्या" का उपयोग नहीं करेगा बल्कि इसके बजाय '# SOF_FLOAT 2.0' परिभाषित करेगा, इसके बाद 'x = SOME_FLOAT * y;'। या इससे भी बेहतर, लागू होने पर, 'const' चर का उपयोग करें। – Lundin

+2

एक कॉन्स वैरिएबल 'भी बेहतर' नहीं है। यह हानिकारक माना जाता है। –

2

उस मैक्रो का बिल्कुल कोई फायदा नहीं है और जिसने इसे लिखा है उसे भ्रमित होना चाहिए। कोड x = 2.0*y; के बराबर है।

1

अच्छी तरह से इस तरह का मैक्रो वास्तव में उपयोगी हो सकता है जब मैक्रो विस्तार को काम करने की आवश्यकता होती है।
ऐसी आवश्यकता का एक सामान्य उदाहरण स्ट्रिंगफिकेशन मैक्रो है। उदाहरण के लिए निम्नलिखित प्रश्न का संदर्भ लें: C Preprocessor, Stringify the result of a macro

अब आपके विशिष्ट मामले में, मुझे अत्यधिक डॉक्यूशन या कोड पार्सिंग उद्देश्यों से लाभ एपर्ट दिखाई नहीं देता है।

+0

स्ट्रिंगफिकेशन मैक्रो के बारे में अच्छा बिंदु जिसे मैंने अपने शोध में पहले भी एसओ पोस्ट में भी सामना किया था http://stackoverflow.com/questions/1597007/creating-c-macro-with-and-line-token-concatenation-with- positioning-macr हालांकि मुझे मिला कोड में, इसका उपयोग इस तरह से नहीं किया जाता है – Pankrates

0

एक अन्य प्रयोग भविष्य समारोह आमंत्रण, कुछ इस तरह के रूप में उन मूल्यों को आरक्षण हो सकता है:

/* #define CONST(x) (x) */ 
#define CONST(x) some_function(x) 

// ... 

double x, y; 
x = CONST(2.0)*y; // x = some_function(2.0)*y; 
6

कुछ (पुराने) सी compilers const कीवर्ड का समर्थन नहीं करते और इस मैक्रो सबसे शायद एक की एक संस्मरण है विभिन्न कंपाइलर्स को संभालने वाले मैक्रोज़ का अधिक विस्तृत अनुक्रम। x = CONST(2.0)*y; में प्रयुक्त होता है हालांकि कोई समझ नहीं आता है।

अधिक जानकारी के लिए आप this section from the Autoconf documentation देख सकते हैं।

संपादित करें: इस मैक्रो का एक अन्य उद्देश्य कस्टम प्रीप्रोकैसिंग (उदाहरण के लिए कुछ स्थिरांक निकालने और/या प्रतिस्थापन के लिए) हो सकता है, जैसे क्यूटी फ्रेमवर्क के Meta Object Compiler करता है।

0

इस मैक्रो बारे में एक और अच्छी बात यह

result=CONST(number+number)*2; 

या कुछ और की तुलना

result=CONST(number>0)*2; 

से संबंधित की तरह कुछ होगा यदि इस मैक्रो के साथ कुछ समस्या है, यह शायद नाम है। यह "कॉन्स्ट" चीज स्थिरांक से संबंधित नहीं है लेकिन कुछ अन्य चीज़ों के साथ है। यह जानने के लिए बाकी कोड को देखना अच्छा लगेगा कि लेखक ने इसे CONST क्यों कहा।

0

इस मैक्रो का मैक्रो विस्तार के दौरान एक्स के आसपास कोष्ठक लपेटने का प्रभाव पड़ता है।

मेरा अनुमान है कि किसी

CONST(3+2)*y 

की तर्ज पर कुछ जो, कोष्ठक के बिना,

3+2*y 

बन जाएगा के लिए अनुमति देने के लिए कोशिश कर रहा है लेकिन कोष्ठक के साथ हो जाता है

(3+2)*y 

मुझे याद है कि हमें पिछले विकास के जीवनकाल में ऐसा कुछ करने की आवश्यकता थी।

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

  • कोई संबंधित समस्या नहीं^_^