परिभाषित मैक्रो में प्रगति


99

क्या अन्य बयानों के साथ मैक्रो स्टेटमेंट को मैक्रो में एम्बेड करने का कोई तरीका है?

मैं कुछ हासिल करने की कोशिश कर रहा हूं:

#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type_(int handle);                  \
    void delete_ ## type(int handle);                                                \
    #pragma weak delete_ ## type_ = delete_ ## type

अगर कोई मौजूद है, तो मैं बूस्ट सॉल्यूशंस (वेव फॉर सेव) के साथ ठीक हूं।


5
तर्क है कि यह न तो है - #pragmas C या C ++ मानकों द्वारा परिभाषित नहीं हैं।

प्रीप्रोसेसर है, भले ही विशिष्ट अनुमत उपकमांड वह चलाना चाहता है।
पिल्ला

@ डीडएमजीएम: कई बेहतरीन चीजें हैं जो सी और सी ++ के बीच आम हैं। जबकि प्रीप्रोसेसिंग ज्यादातर आम है, इस बात के बड़े अंतर हैं कि किस तरह से प्रीप्रोसेसिंग निर्दिष्ट किया जाता है, जिसके आधार पर भाषा मानक का उपयोग किया जा रहा है (C89, C99, C ++, और C ++ 0x FCD)।
जेम्स मैकनेलिस

2
@James McNellis: सिर्फ इसलिए कि तकनीकी रूप से, अधिकांश C प्रोग्राम C ++ के लिए पोर्टेबल हैं, जो वास्तव में सामान्य कार्यक्षमता नहीं बनाते हैं, क्योंकि कोई भी C ++ प्रोग्रामर इसका अधिकांश हिस्सा नहीं करेगा। दो भाषाओं में वास्तव में बहुत कुछ नहीं है।
पिल्ला

जवाबों:


116

यदि आप c99 या c ++ 0x का उपयोग कर रहे हैं तो प्रागमा ऑपरेटर है, जैसा कि प्रयोग किया जाता है

_Pragma("argument")

जो के बराबर है

#pragma argument

सिवाय इसका उपयोग मैक्रोज़ में किया जा सकता है (सी९९ मानक के ६.१०.९ देखें, या १६.९ + सी ० सी ० एक्स ० सी ० समिति के सदस्य हैं)

उदाहरण के लिए,

#define STRINGIFY(a) #a
#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type ## _(int handle);                  \
    void delete_ ## type(int handle);                   \
    _Pragma( STRINGIFY( weak delete_ ## type ## _ = delete_ ## type) )
DEFINE_DELETE_OBJECT(foo);

जब gcc -Eदेता है

void delete_foo_(int handle); void delete_foo(int handle);
#pragma weak delete_foo_ = delete_foo
 ;

32
एक FYI के रूप में: MSVC में __pragma()प्रीप्रोसेसर ऑपरेटर होता है, जो दुर्भाग्य से C99 के _Pragma()ऑपरेटर से थोड़ा अलग होता है (C99 का स्ट्रिंग शाब्दिक है, MSVC का टोकन जो स्ट्रिंग में नहीं है): msdn.microsoft-en-us
माइकल बूर

15
@MichaelBurr MSVC हमेशा अलग होता है, है ना?
थॉमस

5

एक अच्छी बात आप _प्रगमा ("तर्क") के साथ कर सकते हैं इसका उपयोग कुछ संकलक मुद्दों जैसे कि से निपटने के लिए किया जाता है

#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif

0

नहीं, ऐसा करने का कोई पोर्टेबल तरीका नहीं है। फिर, #pragma का उपयोग करने के लिए कोई पोर्टेबल तरीके नहीं हैं। इस वजह से, कई सी / सी ++ कंपाइलर प्राग्मा जैसी चीजों को करने के लिए अपने स्वयं के तरीकों को परिभाषित करते हैं, और उन्हें अक्सर मैक्रोज़ में एम्बेड किया जा सकता है, लेकिन आपको प्रत्येक कंपाइलर पर एक अलग मैक्रो परिभाषा की आवश्यकता होती है। यदि आप उस मार्ग पर जाने के इच्छुक हैं, तो आप अक्सर इस तरह से सामान करते हैं:

#if defined(COMPILER_GCC)
#define Weak_b
#define Weak_e __attribute__((weak))
#elif defined(COMPILER_FOO)
#define Weak_b __Is_Weak
#define Weak_e
#endif

#define DEFINE_DELETE_OBJECT(type)                      \
    Weak_b void delete_ ## type_(int handle) Weak_e;    \
    Weak_b void delete_ ## type(int handle)  Weak_e;    

यदि आप स्पष्ट रूप से परिभाषित नहीं करना चाहते हैं Weak_bऔर Weak_eशुरू-और-अंत ब्रैकेटिंग निर्माणों के रूप में, क्योंकि जीसीसी जैसे कुछ संकलक एक प्रकार के हस्ताक्षर के लिए एक परिशिष्ट के रूप में विशेषताओं को जोड़ते हैं, और कुछ, जैसे एमएससी इसे एक उपसर्ग के रूप में जोड़ते हैं (या कम से कम यह किया था) एक बार, जब से मैंने MSC का उपयोग किया है, तो यह वर्षों से है)। कोष्ठक संदूषण होने से आप कुछ ऐसा काम कर सकते हैं, जो हमेशा काम करता है, भले ही आपको पूरे प्रकार के हस्ताक्षर एक कंपाइलर निर्माण में करने पड़ें।

यदि आप चाहते हैं कि विशेषताओं के बिना एक संकलक को पोर्ट करने की कोशिश करें, तो आप कुछ भी नहीं कर सकते हैं, लेकिन मैक्रोज़ को कुछ नहीं करने के लिए छोड़ दें और उम्मीद करें कि आपका कोड अभी भी चलता है। विशुद्ध रूप से चेतावनी देने या व्यावहारिक अनुकूलन के मामले में, यह संभावना है। अन्य मामलों में, इतना नहीं।

ओह, और मुझे संदेह है कि आपको वास्तव में Weak_b और Weak_e को मैक्रोज़ के रूप में परिभाषित करना होगा जो पैरामीटर लेते हैं, लेकिन मैं डॉक्स के माध्यम से पढ़ने के लिए तैयार नहीं था कि इस उदाहरण के लिए केवल एक कमजोर परिभाषा कैसे बनाई जाए। मैं पाठक के लिए एक अभ्यास के रूप में छोड़ देता हूं।


-3

अन्य बयानों के साथ मैक्रो स्टेटमेंट को मैक्रो में एम्बेड करने का कोई तरीका है?

नहीं, आप प्रीप्रोसेसर स्टेटमेंट को प्रीप्रोसेसर स्टेटमेंट्स में नहीं डाल सकते। हालाँकि, आप इसे किसी inlineफ़ंक्शन में रख सकते हैं । Cहालांकि यह टैग को हरा देता है ।


1
क्या अच्छा है यह एक इनलाइन फ़ंक्शन में डाल देगा? प्रीप्रोसेसर निर्देश कुछ भी करने से पहले संसाधित होते हैं जो एक फ़ंक्शन को पहचान सकते हैं।

2
C99 में inlineसबसे प्रमुख C89 कार्यान्वयन में कुछ भिन्नता है।
क्रिस लुत्ज़

@ क्रिस मान लें कि आपकी टिप्पणी को मुझ पर निर्देशित किया गया - आपकी बात है - क्या?

@ नील - नहीं, क्षमा करें। मैं इसे @ sbi के अंतिम वाक्य पर निर्देशित कर रहा था।
क्रिस लुत्ज

1
@ क्रिस: आह, तो inlineसी + सी से उधार ली गई एक और चीज है! :)
sbi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.