2012-02-01 22 views
9

में स्ट्रिंग को संगत करना क्या फ़ाइल नाम (सी में) को शामिल करते समय स्ट्रिंग को किसी अन्य मैक्रो से जोड़ना संभव है। उदाहरण के लिए,C#include फ़ाइल नाम

मेरे पास है,

#define AA 10 
#define BB 20 

इन मानकों है कि कार्यक्रम के साथ बदल

रन हैं और फ़ाइल में शामिल हैं:

#include "file_10_20" // this changes correspondingly i.e. file_AA_BB 

यह संभव किसी भी तरह #include "file_AA_BB" की तरह कुछ है करने के लिए है ? मैं यह पाया कि डबल पाउंड ऑपरेटर तारों को जोड़ सकता है लेकिन इसे करने का कोई तरीका नहीं मिल सका।

किसी भी मदद की सराहना की जाएगी।

+0

'# शामिल करें # (फ़ाइल _ ## एए ## _ ## बीबी)' – asaelr

उत्तर

16

सबसे पहले मैंने सोचा था कि "इतना आसान है", लेकिन यह कुछ प्रयास करने यह पता लगाने की क्या किया:

#define AA 10 
#define BB 20 

#define stringify(x) #x 
#define FILE2(a, b) stringify(file_ ## a ## _ ## b) 
#define FILE(a, b) FILE2(a, b) 

#include FILE(AA, BB) 

अनुरोध मैं समझाने की कोशिश करेंगे। FILE(AA, BB)FILE2(AA, BB) तक फैला है लेकिन फिर AA और BB FILE2 से पहले विस्तारित किया गया है, इसलिए अगला विस्तार FILE2(10, 20) है जो stringify(file_10_20) तक फैला हुआ है जो स्ट्रिंग बन जाता है।

यदि आप FILE2 को छोड़ते हैं तो आप stringify(file_AA_BB) के साथ समाप्त हो जाएंगे जो काम नहीं करेगा। सी मानक वास्तव में मैक्रो विस्तार कैसे किया जाता है यह परिभाषित करने वाले कई पृष्ठों को खर्च करता है। मेरे अनुभव में सोचने का सबसे अच्छा तरीका यह है कि "अगर पर्याप्त विस्तार नहीं हुआ है, तो define"

केवल स्ट्रिंगली काम नहीं करेगा क्योंकि एए को 10 से प्रतिस्थापित करने से पहले लागू किया गया है। इस प्रकार आप आमतौर पर चाहते हैं यह वास्तव में, उदाहरण के लिए:

#define debugint(x) warnx(#x " = %d", x) 
debugint(AA); 

प्रिंट होगा

AA = 10 
+0

यदि आप मुझे समझाने में सक्षम हैं कि FILE मैक्रो आवश्यक क्यों है I- am)। मैंने पहले से ही इस तरह के कई रचनाएं देखी हैं और कभी नहीं समझा है कि क्यों केवल 2 मैक्रोज़ काम नहीं करते हैं या फिर भी एसाल का जवाब काम नहीं करता है। मुझे यह जानने में बहुत दिलचस्पी है कि प्रीप्रोसेसर आपके उदाहरण में कैसे काम करता है। क्या कोई समझा सकता है? – Artur

+1

#undef फ़ाइल को न भूलें, क्योंकि यह wildplasser

+0

में कुछ के साथ टकराएगा, शायद मैक्रो नाम का सबसे अच्छा विकल्प नहीं है। –

5

यह आमतौर पर इस तरह प्रयोग किया जाता है:

#define stringify(x) #x 
#define expand_and_stringify(x) stringify(x) 

#define AA 10 
#define BB 20 

#define TEXT1 "AA = " stringify(AA) " BB = " stringify(BB) 
#define TEXT2 "AA = " expand_and_stringify(AA) " BB = " expand_and_stringify(BB) 

TEXT1 = "AA = AA BB = BB" 
TEXT2 = "AA = 10 BB = 20" 

इसे स्ट्रिंगफिकेशन कहा जाता है। आपको this answer जांचना चाहिए।

+0

क्या यह शामिल कथन के लिए काम नहीं करना चाहिए? Http://stackoverflow.com/questions/20524491/preprocessor-concatenation-for-include-path/20524959#20524959 और http://stackoverflow.com/questions/39038867/string-concatenation-for-include-path देखें – Antonio