मैं एक पैटर्न मूल रूप से है कि मध्यमक्या सी मैक्रो के लिए एक तर्क के रूप में कोड ब्लॉक का उपयोग करना ठीक है?
if(condition){
struct Foo m = start_stuff();
{ m.foo = bar(1,2); m.baz = 17; } //this part varies
end_stuff();
}
में बदलता है यह एक मैक्रो taht बनाने के लिए ठीक है एक हिस्सा के साथ कुछ बॉयलरप्लेट कोड है कि है एक तर्क के रूप कि मध्यवर्ती कोड ब्लॉक लेता है? सी में मैक्रो विस्तार के नियम बहुत जटिल लगते हैं, इसलिए मुझे यकीन नहीं है कि क्या कोई भी कोने के मामले नहीं हैं जो भविष्य में मुझे आ सकते हैं और मुझे काट सकते हैं (विशेष रूप से, मुझे नहीं पता कि मैक्रो तर्क अलग कैसे हैं यदि मेरा कोड इसमें अल्पविराम है)।
#define MY_MACRO(typ, do_stuff) do { \
if(condition){ \
struct typ m = start_stuff(); \
do_stuff; \
end_stuff(); \
} \
}while(0)
//usage
MY_MACRO(Foo, {
m.foo = bar(1,2);
m.baz = 17;
});
अब तक केवल बात यह है कि मैं के break
और continue
पर कब्जा कर लिया जा रहा है अगर मैं अपने मैक्रो में पाशन बयानों का उपयोग करें और है कि मेरे विशेष उपयोग के मामले के लिए एक स्वीकार्य दुविधा यह होगा लगता है में कामयाब रहे।
संपादित करें: बेशक, अगर मैं कर सकता तो मैं एक फ़ंक्शन का उपयोग करता। इस प्रश्न में मैंने जो उदाहरण इस्तेमाल किया है वह सरलीकृत है और बिट्स को प्रदर्शित नहीं करता है जो केवल मैक्रो जादू के साथ काम कर सकता है।
डू-टाइम-झूठी एक मानक मुहावरे है जो आपको मैक्रो से बाहर निकलने में सक्षम बनाता है यदि आपको आवश्यकता हो। मैक्रोज़ के बारे में मेरा एकमात्र आरक्षण यह है कि यह विशेष रूप से दुर्घटना स्थितियों में डीबगिंग मुश्किल बनाता है। यदि लगभग 100 लाइनों का लंबा मैक्रो ब्लॉक है, और 5 घंटे तक चलने के बाद, मैक्रो में सैकड़ों कॉलों में से किसी एक पर कोड क्रैश हो जाता है, तो आपको इसे ट्रैक करने में कठिनाई होगी। – cup
त्रुटियों को संकलित करने के लिए, क्लैंग का उपयोग करें। यह विशाल मैक्रोज़ के अंदर वाक्यविन्यास त्रुटियों की पहचान करता है। रन-टाइम त्रुटियों के लिए, मैं आमतौर पर 'gcc -E prog.c | grep -v^# | indent> prog-dbg.c' का उपयोग करता हूं और फिर अन्य कोड में' prog-dbg.c' संकलित और लिंक करता हूं। यह बेकार है लेकिन काम कर रहा है। – user172818
आपकी अवधारणा ठीक है जैसा लगता है ... लेकिन आप अपने जीवन को आसान बनाने के लिए कॉल बैक फ़ंक्शंस क्यों नहीं करते हैं? क्या इनलाइन गति बहुत महत्वपूर्ण है? @cup पॉइंट्स के रूप में यह डीबग करने के लिए एक दर्द है। –