शायद कुछ मल्टी-स्टेज मैक्रो विस्तार का प्रयास करें? यह Boost preprocessor/control/if library द्वारा उपयोग की जाने वाली रणनीति है।
#define FOO_NAME 1
#define FOO__ 2
#define CONC(a,b) a##_##b
#define FOO(x) CONC(FOO,x)
मुझे नहीं लगता कि सी मैक्रो विस्तार के भीतर स्थितियों की जांच करने का कोई तरीका है।
सबसे अच्छी बात यह है कि मैं #
स्ट्रिंगिंग ऑपरेटर का उपयोग करके स्ट्रिंग शाब्दिक में मैक्रो तर्कों को गुप्त करना और फिर रन-टाइम फ़ंक्शंस का उपयोग करके जांच करना चाहता हूं। (यह, हालांकि, अपने मामले के लिए काम करेंगे नहीं जहां उत्पादन चर घोषणाओं करना चाहते हैं।)
उदाहरण के लिए, निम्नलिखित प्रिंट "011":
#define FOO(x) (strcmp("NAME", #x) ? 1 : 0)
main()
{
printf("%d", FOO(NAME));
printf("%d", FOO(1));
printf("%d", FOO(2));
}
संकलक संभावना strcmp
तुलना अनुकूलन होगा संकलन समय पर, यह वास्तविक प्री-प्रोसेसर सशर्त उपलब्ध होने के मुकाबले अब और अधिक अक्षम नहीं होगा। हालांकि, FOO
बनाना एक सामान्य कार्य स्पष्ट और संभवतः उतना ही कुशल होगा।
स्रोत
2013-09-25 17:19:20
मैक्रोज़ भयानक हैं। –
क्या आप इस उद्देश्य को समझा सकते हैं, या शायद एक बेहतर उदाहरण दे सकते हैं? पैरामीटर को संकलन समय पर तय करना होगा, जिसका अर्थ है कि आप दो अलग-अलग मैक्रो नामों का भी उपयोग कर सकते हैं। – lurker
@mbratch: इस विशेष मामले में, मैं चर के एक सेट को परिभाषित करने के लिए एक मैक्रो का उपयोग कर रहा हूं लेकिन कुछ चर वैकल्पिक हैं और मैं उन्हें परिभाषित करने से बचना चाहता हूं। एकाधिक मैक्रो नाम एक संयोजन विस्फोट के कारण अच्छी तरह से काम नहीं करेंगे: दो परिवर्तनीय नामों के साथ मुझे 'foo (a, b) ',' foo (a, _)', 'foo (_, b) ',' foo (_, b) 'और' के लिए अलग मैक्रोज़ की आवश्यकता होगी। foo (_, _) '। – hugomg