2015-11-06 6 views
10

अगर यह संभव है एक मैक्रो जो इस तरह बर्ताव करता है लिखने के लिए मैं सोच रहा था बिना कहा जा सकता है #define:सी पूर्वप्रक्रमक: मैक्रो कोष्ठकों

void Func(int x) 
{ 
    printf("%d",x); 
} 

#define func Func x //or something 

int main() 
{ 
    func 10; //<---- remove parenthesis 
} 

इस मामले में, func असली समारोह को इंगित करेगा Func, और 10 ब्रांड्स के बिना इसके तर्क होंगे।

मैं सी ++ में लेकिन सी में new ऑपरेटर के लिए कुछ इसी तरह प्राप्त करने के लिए कोशिश कर रहा हूँ

उदाहरण:

class Base* b = new(Base); 

इस मामले में, classstruct के लिए एक मैक्रो है, new एक समारोह है जो फ़ंक्शन पॉइंटर लेता है, और Base एक ऐसा फ़ंक्शन है जो struct Base के लिए मेमोरी आवंटित करता है।

मैं कुछ इस तरह के कोड के पुनर्लेखन के लिए करना चाहते हैं: मुझे नहीं लगता कि आप कर सकते हैं करते हैं

class Base* b = new Base; 

कौन सा संभव हो जाएगा अगर मैं एक मैक्रो :)

+1

एक मैक्रो पैरामीटर कोष्ठक में हो नहीं करना चाहिए? – Matso

+0

ठीक है, उन "फ़ंक्शन मैक्रोज़" में सामान्य फ़ंक्शन सिंटैक्स होता है, जैसे '#define func (x) Func (x) '। कॉल सामान्य कार्य की तरह होगा, उदा। 'समारोह (10)'। क्या तुम यही चाहते हो? –

+0

@ एहसान यह एक सी ++ प्रश्न नहीं है, इसकी शुद्ध सी है और प्रीप्रोसेसर साथी – Mamma

उत्तर

2

अजीब पर्याप्त तुम सिर्फ new को परिभाषित दूर (#define new) और प्रत्येक निर्माता की तरह समारोह जो, कोष्ठक के साथ एक वास्तविक समारोह कॉल का उत्पादन #define BASE Base() की तरह के लिए एक टोकन परिभाषित करने के साथ दूर हो सकता है।

कि निम्नलिखित कोड कानूनी सी बनाना चाहिए:

#define new 
#define class struct 
#define BASE Base() 

// forward declaration 
class Base; 
extern class Base *Base(); 

void f() 
{ 
    class Base* b = new BASE; 
} 
+0

हाहाहा ने काम किया: डी मैं कक्षा बेस * बी = नया बेस() लिख सकता हूं; अब, चीयर्स साथी। यह एक ट्रोलफेस्ट होने जा रहा है। चीयर्स दोस्त – Mamma

+0

हाँ, यह आसान था, नहीं था ;-)। तकनीकी सावधानी का एक शब्द (जोआचिम और एमएम द्वारा सावधानी के सामान्य शब्दों के अलावा): 'बाहरी वर्ग बेस * बेस();' सी ++ में संकलित नहीं होगा क्योंकि संरचना टैग (यहां 'संरचना बेस' से 'बेस') सी में एक अलग "नाम स्थान" में रहते हैं, लेकिन सी ++ में नहीं, जहां वे उचित प्रकार के नामों का निर्माण करते हैं और इसलिए फ़ंक्शन नाम से संघर्ष करते हैं। –

+0

हाँ मैं कुछ कोड को फिर से लिखता हूं इसलिए नया बेस (तर्क ...) का उपयोग सी ++ में किया जा सकता है, इसकी तरह का ठंडा। बहुत बहुत धन्यवाद दोस्त – Mamma

1

के साथ आ सकते हैं तुम्हें चाहिए। यदि आप एक पैरामीटर के साथ कोई मैक्रो, जैसे #define func(x) Func(x) है, तो आप इसे कॉल करने के लिए के रूप में आप एक समारोह कहेंगे जरूरत है: आप पैरामीटर के बिना किसी मैक्रो है, तो

#define func(x) Func(x) 
func(x) // Will be replaced by Func(x) during pre-processing 

, तो मूल्य केवल पूर्व के दौरान बदल दिया जाता है प्रसंस्करण:

#define MY_VAL 110 
func(MY_VAL) // Will be replaced by Func (110) during pre-processing 

यह बहुत आसान पहले ब्रैकेट दूर करने के लिए है ...

#define func Func(
func 10); 

... पूरी तरह से वैध है, लेकिन काफी अजीब है। मुझे नहीं लगता कि दुर्भाग्यवश, समापन ब्रैकेट को हटाने का कोई तरीका है।

के रूप में जोआचिम Pileborg अपनी टिप्पणी में कहा, मैं एक अच्छा करने के लिए है कि एक असली C कार्यक्रम में कारण नहीं दिख रहा है।

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