2010-06-12 24 views
76

परिभाषित करने में प्रगमा क्या अन्य विवरणों के साथ मैक्रो में प्रगमा कथन एम्बेड करने का कोई तरीका है?मैक्रो

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

मैं बढ़ावा समाधान (लहर को छोड़ कर) यदि कोई मौजूद है के साथ ठीक हूँ:

मैं की तरह कुछ प्राप्त करने के लिए कोशिश कर रहा हूँ

+5

यकीनन यह है न ही कुछ संकलक मुद्दों से निपटने के लिए है - #pragmas या तो सी या सी ++ मानकों द्वारा परिभाषित नहीं हैं। –

+0

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

+0

@DeadMG: सी और सी ++ के बीच आम हैं जो बहुत सी चीजें हैं। जबकि प्रीप्रोसेसिंग _mostly_ आम है, वहीं प्रीप्रोसेसिंग को किस भाषा मानक का उपयोग किया जा रहा है (C89, C99, C++, और C++ 0x FCD) के आधार पर प्रीप्रोसेसिंग निर्दिष्ट करने में प्रमुख अंतर हैं। –

उत्तर

94

आप c99 या C++ 0x pragma ऑपरेटर,

_Pragma("argument") 

रूप में इस्तेमाल किया जो

#pragma argument 

के बराबर है सिवाय यह मैक्रो में इस्तेमाल किया जा सकता है (देखें उपयोग कर रहे हैं c99 मानक की धारा 6.10.9, या की 16.9 C++ 0x अंतिम समिति मसौदा)

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

#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 
; 
+29

एक एफवाईआई के रूप में: एमएसवीसी में '__pragma()' प्रीप्रोसेसर ऑपरेटर है, जो दुर्भाग्य से सी 99 के '_Pragma()' ऑपरेटर से थोड़ा अलग है (सी 99 एक स्ट्रिंग अक्षर लेता है, एमएसवीसी के लेक टोकन जो स्ट्रिंग में नहीं हैं): http://msdn.microsoft.com/en-us/library/d9x1s805.aspx –

+10

@MichaelBurr एमएसवीसी हमेशा अलग होना चाहिए, है ना? – Thomas

-3

क्या अन्य विवरणों के साथ मैक्रो में प्रगमा कथन को एम्बेड करने का कोई तरीका है?

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

+1

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

+2

सी 99 में 'इनलाइन' है, और अधिकांश प्रमुख सी 8 9 कार्यान्वयन में कुछ भिन्नता है। –

+0

@Chris आपकी टिप्पणी मानते हुए मुझे निर्देशित किया गया था - आपका मुद्दा है - क्या? –

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 शुरू और अंत bracketing निर्माणों के रूप में परिभाषित करना चाहते हैं क्योंकि जीसीसी जैसे कुछ compilers गुणों को एक प्रकार के हस्ताक्षर में एक परिशिष्ट के रूप में जोड़ें, और कुछ, जैसे कि एमएससी इसे उपसर्ग के रूप में जोड़ता है (या कम से कम यह एक बार किया गया है, जब से मैंने एमएससी का उपयोग किया है)। ब्रैकेटिंग संरचना होने से आप हमेशा कुछ काम करने की अनुमति देते हैं जो हमेशा काम करता है, भले ही आपको पूरे प्रकार के हस्ताक्षर को कंपाइलर निर्माण में पास करना पड़े।

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

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

4

एक अच्छी बात यह है कि आप _Pragma ("कथन") के साथ कर सकते इसका इस्तेमाल इस तरह के

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