2011-09-13 15 views
6

मैं अपने कोड से डायग्नोस्टिक संदेशों को प्रिंट करने के लिए __FILE__ और __LINE__ मैक्रोज़ का उपयोग कर रहा था (था)। जब आप GCC का उपयोग करते हैं तो यह बहुत अच्छी तरह से काम करता है, फ़ाइल कमांड लाइन पर निर्दिष्ट के रूप में छोटा है। मैंने हाल ही में कोडलाइट का उपयोग करने के लिए स्विच किया है जो इमारत के दौरान पूरी तरह से योग्य फ़ाइल नाम (कम से कम विंडोज़ के तहत) का उपयोग करता है। अचानक मेरा डायग्नोस्टिक आउटपुट लगभग पठनीय नहीं है।प्रीप्रोसेसर में केवल फ़ाइल नाम कैसे प्राप्त करें?

प्रीप्रोसेसर में फ़ाइल नाम का केवल फ़ाइल घटक प्राप्त करने का कोई तरीका है? मैं एक गैर पोर्टेबल जीसीसी विशिष्ट समाधान के साथ रह सकता हूं। (मैं सादे __FILE__ अन्य मामलों पर वापस आने जाएगा।)

ज़रूर मैं एक समारोह के माध्यम से __FILE__ की सामग्री गुजरती हैं और केवल फ़ाइल घटक निकाल सकते हैं, लेकिन स्ट्रिंग आपरेशन क्या मैं नैदानिक ​​संदेश है कि परिवर्तन नहीं होना चाहिए के लिए मन में था नहीं था क्रम व्यवहार ...

नोट: मैं फ़ाइल नाम जिस तरह से जीएनयू इसे इस्तेमाल करता है का उपयोग करें। एक पथ फ़ाइल नामों का संग्रह है और एक फ़ाइल नाम या तो फ़ाइल का एक सापेक्ष या पूर्ण पहचानकर्ता है। एक फ़ाइल नाम निर्देशिका घटक और फ़ाइल घटक से बना जा सकता है।

+0

निदान परिवर्तन क्रम व्यवहार (अन्यथा कोई निदान होगा) करता है, और क्या आप कहते हैं एक अतिरिक्त समारोह उत्पादन के बाद से ही पुस्तकालय कार्यों बुला रहा है वैसे भी उत्पादन करना है, थोड़ा फर्क नहीं पड़ता। – eudoxos

+0

डायग्नोस्टिक संदेश को प्रिंट करना आम तौर पर स्ट्रिंग ऑपरेशंस के दर्जनों के अलावा, कुछ गैर-सौम्य फ़ाइल I/O क्रियाओं के अलावा होता है। किसी कारण से कोई भी इसके बारे में चिंतित नहीं लगता है। किसी अन्य साइड-इफेक्ट-फ़्री फ़ंक्शन पर कॉल जोड़ने के बारे में चिंता क्यों करें जो केवल डायग्नोस्टिक संदेशों को प्रभावित करती है? –

+0

आप दोनों सही हैं, डायग्नोस्टिक्स जोड़ना प्रभाव मुक्त नहीं है। मैंने इसे इस तरह कार्यान्वित किया, मैंने इसे एक समारोह के माध्यम से पारित करने दिया। मैं इसे और सोच रहा था जैसे यह अस्तित्व में है। यह निश्चित रूप से मानक नहीं है, लेकिन इसके बारे में दस्तावेज़ीकरण ढूँढना सही नहीं है। (यहां तक ​​कि जीसीसी के मैनुअल हर पूर्वनिर्धारित मैक्रो की रूपरेखा तैयार नहीं है।) – rioki

उत्तर

3

कोई ज्ञात प्रीप्रोसेसर मैक्रो नहीं है जो कार्यक्षमता प्रदान करता है। एक फ़ंक्शन सीम के माध्यम से केवल एक समझदार विकल्प की तरह __FILE__ पास करना।

+0

जीसीसी के लिए वहाँ है [\ _ \ _ BASE_FILE \ _ \ _] (https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html)। – fret

+1

@fret: मेरे लिए, '__BASE_FILE__' '__FILE__' जैसा ही आउटपुट करता है। यदि आप जिस दस्तावेज़ को लिंक करते हैं, उसे पढ़ते हैं, तो यह 'मुख्य' फ़ंक्शन (वर्तमान फ़ाइल भी नहीं) के साथ फ़ाइल का नाम (जरूरी बेसनाम नहीं) प्रदान करता है। – JellicleCat

+1

@JellicleCat तुम ठीक कह रहे ... – fret

8

आप जीएनयू तो बनाओ उपयोग कर रहे हैं तो आप बस (पारित कर सकते हैं डी BASE_FILE_NAME = \ "$ * सी। \" संकलन के पूर्व प्रसंस्करण मंच पर में आप उन्हें अलग से कर रहे हैं, या संकलन पर एक एकल में अगर मंच, जो आदर्श है)।

यह आपके फ़ाइल नाम निर्धारित करने के तरीके पर निर्भर करता है। मेरा सादा फ़ाइल नामों की एक सूची से आया है और बाद के चरण में मेकफ़ाइल में फ़ंक्शंस का उपयोग करके निर्देशिकाओं के साथ प्रीफ़िक्स किया गया है।

आईई, यह मेरे लिए अच्छा काम करता है, लेकिन आपका माइलेज भिन्न हो सकता है! :-)

मेरे मेकअप "कोड" का एक सरलीकृत संस्करण:

CLASSES = main.c init.c 

PREPROCESSED = $(patsubst %.c,$(PPCDIR)/%.pp.c,$(CLASSES)) 

$(PREPROCESSED): $(PPCDIR)/%.pp.c: %.c $(ALLH) 
    $(GCC) $(GCCOPTS) -D BASE_FILE_NAME=\"$*\" -E $< > [email protected] 

अपने कोड आप :-)

+0

दुर्भाग्य से मैं CodeLite, वह मेरे लिए makefiles उत्पन्न करता है के साथ काम कर रहा हूँ। कोडलाइट का उपयोग करना बहुत अच्छा है, जब तक कि आप कुछ ऐसा नहीं करना चाहते जो मानक से बाहर हो। अभी भी अच्छा विचार, +1 – rioki

+0

वही विचार विजुअल स्टूडियो में उपयोग किया जा सकता है। विजुअल स्टूडियो 2008 में: प्रोजेक्ट फ़ाइल (.vcproj) -> गुण -> कॉन्फ़िगरेशन गुण -> सी/सी ++ -> प्रीप्रोसेसर -> प्रीप्रोसेसर परिभाषाओं पर राइट क्लिक करें। __BASE_FILE __ = \ "$ (इनपुटफाइलनाम) \" जोड़ें। आप अपनी स्रोत फ़ाइलों में __FILE__ के बजाय __BASE_FILE__ का उपयोग कर सकते हैं। – user720594

4

जबाब ऊपर FredCooke करने के लिए की तरह के रूप में में BASE_FILE_NAME बस का उपयोग करें, आप विनिमय कर सकते हैं इस लाइन:

साथ
-D BASE_FILE_NAME=\"$*.c\" 

:

-D BASE_FILE_NAME=\"$(<F)\" 

यह आपको .cpp के लिए उचित फ़ाइल नाम विस्तार भी देगा।

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