2009-10-20 10 views
5

__FILE__ और __LINE__ मैक्रो __FILE__ कैसे लिख सकता हूँ सी पूर्व प्रोसेसर में निर्मित होते हैं, और अक्सर फ़ाइल नाम और लाइन नंबर के साथ डिबग आउटपुट मुद्रण के लिए उपयोग किया जाता है। मुझे कुछ इसी तरह की ज़रूरत है, लेकिन पथ के अंत में निर्देशिका के नाम के साथ। उदाहरण के लिए यदि मेरा कोड इस प्रकार है: /home/davidc/कुछ/पथ/से/कुछ/कोड/foo/bar मुझे एक मैक्रो की आवश्यकता है जो मुझे "बार" देगी, अगर कोड/home/davidc/कुछ/पथ/से/कुछ/कोड/foo/मधुमक्खी तो मुझे इसे "मधुमक्खी" देने के लिए इसकी ज़रूरत है।मैं एक cpp __DIR__ मैक्रो, समान

कोई विचार? (बीटीडब्ल्यू, यह एक सी ++ आवेदन के लिए है)।

अद्यतन: स्पष्ट होने के लिए, मैं एक मैक्रो के बाद हूं जो मुझे संकलन-समय पर निर्देशिका नाम वाली एक स्ट्रिंग देगा, मैं रनटाइम पर कोई स्ट्रिंग-प्रोसेसिंग नहीं करना चाहता हूं।

उत्तर

6

आप जीएनयू make उपयोग कर रहे हैं अपनी परियोजना के निर्माण के लिए है, तो आप कुछ इस तरह करने में सक्षम हो सकता है:

%.o: %.cpp 
    $(CC) $(CFLAGS) -D__DIR__="$(strip $(lastword $(subst /, , $(dir $(abspath $<)))))" -c $< -o [email protected] 

कि के बारे में सबसे ईश्वर भयंकर हो गया है चीज जो मैंने मेकफ़ाइल में थोड़ी देर में करने के बारे में सोचा है। मुझे नहीं लगता कि आपको कंपाइलर की सीमाओं के भीतर ऐसा करने का एक त्वरित या साफ तरीका मिलेगा, इसलिए मैं संकलन प्रक्रिया में जानकारी को इंजेक्ट करने के चालाक तरीकों की तलाश करूंगा।

शुभकामनाएं।

+0

डी 'ओ पर जी ++ का उपयोग कर रहा हूं, आपने मुझे एक मिनट तक हराया - मैं काफी सटीक वही कर रहा था। यदि अंतिम निर्देशिका में रिक्त स्थान हैं, तो यह काफी काम नहीं करता है, लेकिन अन्यथा यह एक सही समाधान है। और मेरा विश्वास करो - मैंने पहले मेकफ़ाइल में * दूर * बदतर monstrosities देखा है। –

+0

@Adam: मुझे आज रात शून्य से शुरू होने वाले संस्करण संख्याओं को प्राप्त करने के लिए कुछ _fixups_ करना पड़ा। 07.64 से 08.01 तक जाकर हमें बहुत अनावश्यक दुःख हुआ। –

+0

मैं सीएमके का उपयोग कर रहा हूं, इसलिए मुझे ऐसा करने में सक्षम होना चाहिए। धन्यवाद! –

4

इसके लिए मैक्रो में कोई निर्मित नहीं है, लेकिन जाहिर है कि आप अपना खुद का छोटा पार्सिंग दिनचर्या लिख ​​सकते हैं जो एक फ़ाइल लेता है और दिए गए पूर्ण पेटेड फ़ाइल नाम के लिए निर्देशिका नाम निकाल देता है।

extern std::string parseLastDir (const char *path); 

तो फिर तुम इस तरह एक मैक्रो बना सकते हैं: इस फ़ंक्शन को कॉल करने देता है

#define __DIR__ parseLastDir (__FILE__) 

जो आप क्या चाहते हैं की तरह तरह की व्यवहार करेंगे (यह आप एक एसटीडी के बजाय एक चार का देता :: स्ट्रिंग * ताकि सफाई (इतना है कि यह हमेशा सही निर्देशिका हो जाता है उसके परिणामों, फ़ाइल जिसमें उसके लागू पर निर्भर करता है।) प्रासंगिक अर्थ विज्ञान के साथ बेहतर परिभाषित किया गया है)

+0

बात यह है कि, मैं संकलन समय पर 'parseLastDir' होना चाहता हूं (ऐसा कोई कारण नहीं है, क्योंकि __FILE__ पूर्व निर्धारित है)। मैं शायद बूस्ट :: एमपीएल में कुछ सोच रहा था या मैक्रो के अंदर कुछ अन्य हैकी टेम्पलेट मेटाप्रोग्रामिंग मुझे ऐसा करने दे सकता है .. यह एक प्रदर्शन-महत्वपूर्ण अनुप्रयोग के लिए है, और मैं अनावश्यक स्ट्रिंग करने में समय बर्बाद नहीं करना चाहता रनटाइम पर प्रसंस्करण। –

+0

woops, मार्कडाउन के बारे में भूल गए जो \ __ FILE__ होना चाहिए, __FILE__ –

+1

समस्या स्ट्रिंग अक्षर तक संकलित समय तक पहुंच के साथ है - अब यह संभव नहीं है। ऐसा लगता है कि हमारे पास C++ 1x में संकलन-समय स्ट्रिंग प्रोसेसिंग होगी। –

2

यूनिक्स

को कुछ इसी तरह क्या आप चाहते
__BASE_FILE__ 

इसके लिए http://theory.uwinnipeg.ca/localfiles/infofiles/gcc/cpp_13.html के आसपास एक नज़र डालें। आशा है कि ये आपकी मदद करेगा।

संपादित करें: प्रयास दो

कैसे #line पूर्वप्रक्रमक आदेश का उपयोग कर के बारे में। आप इसे फ़ाइल नाम वैरिएबल को बदलने के लिए भी उपयोग कर सकते हैं जैसा कि आप यहां देख सकते हैं: http://www.cppreference.com/wiki/preprocessor/line

+1

बंद करें, लेकिन कोई सिगार नहीं है। यह gen+ में पारित फ़ाइल नाम/पथ देता है, इसलिए यह पथ के कुछ हिस्सों को बंद कर देता है, लेकिन मुझे केवल अंतिम डीआईआर नहीं देता है जैसा कि मैं चाहता हूं (क्योंकि मेरा कोड उप-निर्देशिकाओं के समूह में है) , तो अब मुझे बस/home/davidc/some/path/to/some/code/foo/bar के बजाय foo/bar मिलता है, लेकिन दुर्भाग्य से अभी भी वही समस्या है। –

+0

दमित, बहुत करीब। मैं देख रहा हूँ जाने के लिए जा रहा हूँ। –

2

आपके कंपाइलर/आपके सॉफ़्टवेयर के निर्माण के आधार पर, आप संकलन करते समय वर्तमान या किसी भी पथ के रूप में एक मैक्रो घोषित कर सकते हैं।

gcc -D__DIR__=/usr/src/test/ test.c 

मैंने कभी भी एमएस कंपाइलर का उपयोग नहीं किया है, लेकिन मुझे पता है कि आईसीसी के लिए भी एक समान विकल्प है।

gcc manpage

+0

धन्यवाद, लेकिन यह वह नहीं है जो मैं कर रहा हूं। मैं विभिन्न निर्देशिकाओं में सैकड़ों फाइलों के साथ एक बड़ी परियोजना संकलित कर रहा हूं, विचार यह है कि प्रत्येक फ़ाइल # इस मैक्रो को शामिल कर सकती है, और यह निर्देशिका के नाम को अपने स्वयं के स्रोत फ़ाइल स्थान से संबंधित कर देगी, मैं 'हार्ड- कोड 'विशेष रूप से कहीं भी पथ। –

+0

ओह और हाँ मैं लिनक्स –

0

अपने makefile बदल रहा/प्रणाली का निर्माण इतना है कि .../bar/file.cc के लिए संकलन लाइन -D__DIR__ bar शामिल होंगे के बारे में कैसे। यह आसान होना चाहिए ...

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