2013-03-06 4 views
5

क्या उपयोग/परिभाषा के बिना मैक्रो समारोह की प्रयोज्यता है:सी में परिभाषा के बिना मैक्रो

#ifndef __SYSCALL 
#define __SYSCALL(a, b) 
#endif 

एक हेडर फाइल में Linux सिस्टम में इस मैक्रो पा सकते हैं /usr/include/asm/msr.h

मैं भी निम्न प्रकार के मैक्रो नोटिस ।

#define _M(x) x 

और इस तरह के मैक्रो को परिभाषित करने का एकमात्र कारण है कि मैं कोड वर्दी बनाने के लिए सोच सकता हूं। #define SOMETHING (1 << 0) की तरह। क्या इस तरह के मैक्रोज़ का कोई अन्य छुपा (बेहतर) उपयोग है?

उदाहरण के साथ एक उत्तर बहुत उपयोगी होगा। कोई भी मुझे इस बारे में पढ़ने के लिए एक पाठ/लिंक प्रदान कर सकता है।

+0

__SYSCALL मैक्रो केवल कुछ आर्किटेक्चर पर परिभाषित किया गया है। – fuz

+0

कोड को और वर्दी बनाकर आपका क्या मतलब है? – Hogan

+0

@ होगन क्षमा करें मैं वर्दी द्वारा स्पष्ट रूप से व्यक्त नहीं कर सकता हूं मेरा मतलब है ['# कुछ परिभाषित करें << 0'] (http://stackoverflow.com/questions/15095350/define-something-1-0) –

उत्तर

11

इस फॉर्म की एक मैक्रो का सबसे आम मामले में से एक:

#define _M(x) x 

पीछे की ओर compilers के लिए संगतता है कि केवल सी के मूल कश्मीर & आर बोली, कि अब हर जगह का एएनएसआई predated समर्थित प्रदान करना है सी बोलीभाषा मूल के & भाषा की बोली में, फ़ंक्शन घोषित करते समय फ़ंक्शन तर्क निर्दिष्ट नहीं किए गए थे। 1 9 8 9 में, एएनएसआई ने भाषा को मानकीकृत किया और कई सुधारों को शामिल किया, जिनमें फंक्शन प्रोटोटाइप शामिल थे, जिन्होंने तर्कों की संख्या घोषित की।

int f(int x, double y); /* ANSI C. K&R compilers would not accept this */ 

int f(); /* Function declared in the original K&R dialect */ 

जबकि compilers कि सी के मूल कश्मीर & आर बोली का समर्थन दुर्लभ (या विलुप्त) इन दिनों, जब जरूरत compilers दोनों प्रकार का समर्थन किया जा करने के लिए सॉफ्टवेयर का एक बहुत कुछ लिखा गया था, और मैक्रो लिए एक आसान तरीका प्रदान की हैं दोनों का समर्थन करने के लिए। अभी भी बहुत सारे शीर्षलेख हैं जो इस पीछे की संगतता प्रदान करते हैं।

पीछे की ओर कश्मीर & आर compilers के लिए अनुकूलता प्रदान करने के लिए कई हेडर फाइल निम्नलिखित है:

#if ANSI_PROTOTYPES 
# define _P(x) x 
#else 
# define _P(x)() 
#endif 

... 

int f _P((int x, double y)); 

ANSI_PROTOTYPES परिभाषा को सही ढंग से, (या तो उपयोगकर्ता द्वारा या कुछ पूर्व #ifdef तर्क के आधार पर) स्थापित किया गया है, तो आपको वांछित व्यवहार मिलता है:

  • यदि ANSI_PROTOTYPES परिभाषित किया गया है, तो परिभाषा int f(int x, double y) तक फैली हुई है।
  • ANSI_PROTOTYPES परिभाषित नहीं है, तो परिभाषा मेरे सवाल का int f()
+0

में पूर्ण चर्चा, धन्यवाद sfstewman! आपका जवाब वास्तव में अच्छा है। मैंने कुछ और उपयोग जोड़े। –

+0

"* इस फ़ॉर्म के मैक्रो के सबसे आम मामले में से एक ... *" - क्या यह तर्क आज भी मान्य है? – SomeWittyUsername

+1

@icepack इस तरह से बहुत से नए शीर्षलेख लिखे नहीं जा रहे हैं, लेकिन यह उस फ़ॉर्म के मैक्रोज़ के लिए देखे जाने वाले अधिक सामान्य उपयोगों में से एक है। मैं इसके लिए देखे गए कई अन्य उपयोगों के बारे में नहीं सोच सकता। – sfstewman

1

इसका मतलब है कि उस मैक्रो का उपयोग करने वाला कोड सशर्त रूप से कुछ भी दूर नहीं करेगा।

सरल उदाहरणों के रूप में, डीबग कोड, लॉगिंग या दावे पर विचार करें।

3

इसे अक्सर मैक्रो को अक्षम करने के लिए सशर्त अभिव्यक्तियों के साथ प्रयोग किया जाता है जिससे इसे कुछ भी पूर्वप्रभावित नहीं किया जाता है। उदाहरण के लिए (सरलीकृत):

#ifdef DEBUG 
#define ASSERT(x) if(!(x)) { abort(); } 
#else 
#define ASSERT(x) /* nothing */ 
#endif 
+1

ऐसे एक "रिक्त" फ़ंक्शन-जैसे मैक्रो में परेशानी के लिए बहुत सारी संभावनाएं हैं। बेहतर इसे '((शून्य) 0)' या '{{}} (0) 'में परिभाषित करें। Http://stackoverflow.com/questions/1306611/how-do-i-implement-no-op-macro-or-template-in-c – hmijail

1

यह शायद एक डीबग मैक्रो या प्लेटफार्म मैक्रो है। उदाहरण के लिए कहें कि मेरे पास INT3 से जुड़ा एक डीबगर है। मैं इस हो सकता है जब मैं

#define debug() INT3() 

फिर डिबगिंग कर रहा हूँ सुरक्षित मैं उत्पादन कोड को यह जोड़ देंगे होने के लिए (यकीन है कि मैं उन सभी बाहर ले बनाने के लिए)

#define debug() 

यह कुछ इसी तरह की तरह दिखता है

यह हो सकता है कि कुछ मामलों में कुछ सिस्टमों पर इस कोड को कॉल करने की आवश्यकता हो - उदाहरण के लिए एक निश्चित CPU आर्किटेक्चर या ओएस पर। लेकिन आपके सिस्टम पर यह सिर्फ कोई विकल्प नहीं है।

3

बस एक अनुवर्ती करने के लिए फैलता है।

मुझे अच्छे जवाब मिल गए। लेकिन मैं भी कुछ अधिक उपयोगी उदाहरण है जहाँ परिभाषा के बिना मैक्रो उपयोगी होते हैं द्वारा जोड़ा जा रहा है, एक यह भविष्य में उपयोगी पा सकते हैं:

(1): Why do I see THROW in a C library?
C और C++ के बीच हेडर फाइल साझा करने के लिए उपयोग करता है। मैक्रो का नाम ++ _THROW(x)

#ifdef __cplusplus 
    #define __THROW(x) throw(x) 
#else 
    #define __THROW(x) 
#endif 

(2)to eliminate warnings when a function parameter isn't used:
इस प्रयोग ग के लिए है। सी में यह an error too few arguments लेकिन C++ it works with no error में कारण होगा: (codepad जुड़ा हुआ)

#define UNUSED(x) 
int value = 0; 
int foo(int UNUSED(value)) 
{ 
    return 42; 
} 
int main(){ 
    foo(value); 
} 

इसके अतिरिक्त (इस के लिए मैं अपने प्रश्न में C++ टैग जोड़ा),
(3):#define _M(x) x का उपयोग निम्नानुसार है: कोड कोड को समान रूप से बनाने के लिए:

/* Signed. */ 
# define INT8_C(c)  c 
# define INT16_C(c)  c 
# define INT32_C(c)  c 
# if __WORDSIZE == 64 
# define INT64_C(c) C## L 
# else 
# define INT64_C(c) C## LL 
# endif 

फ़ाइल है: /usr/include/stdint.h

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