2012-05-21 7 views
6

मैंने कुछ खोज की है और सी ++ में हेडर फ़ाइलों को शामिल करने के उचित तरीके से समान धागे पाए हैं, लेकिन उनमें से कोई भी इस सवाल का काफी जवाब नहीं देता है।# जब वे एक अलग निर्देशिका संरचना में हैं तो शीर्षलेख फ़ाइलें शामिल करें

मुझे पता है कि आपको बस निम्न सिंटैक्स का उपयोग कर सकते हैं किसी अन्य फ़ोल्डर में एक हेडर फाइल को शामिल करने में:

#include "../myFolder/myFile.h" 

लेकिन जब फ़ाइल एक अलग निर्देशिका संरचना में है के बारे में क्या थोड़ा दूर कर दिया? उदाहरण के लिए, निम्नलिखित की तरह कुछ सच होने की गारंटी है यदि:

वर्तमान निर्देशिका =/f1/f2/f3/F4/F5/myFile.cpp

वांछित हैडर निर्देशिका =/f1/D2/D3/डी 4/डी 5/डी 6/myHeader.h

मुझे पता है कि आप "अतिरिक्त शामिल निर्देशिकाएं" संपत्ति सेट कर सकते हैं या एक मेक फ़ाइल का उपयोग कर सकते हैं, लेकिन मैं जानना चाहता हूं कि इसे करने का कोई तरीका है या नहीं #include कथन।

+1

आप स्पष्ट रूप से अपने शामिल कथन (जो मैं अनुशंसा नहीं करता) में उस संपूर्ण रिश्तेदार या पूर्ण पथ को डाल सकता हूं, लेकिन मुझे संदेह है कि आप कुछ और कॉम्पैक्ट की तलाश कर रहे हैं? – JohnMcG

+0

टिप्पणी के लिए धन्यवाद! मैं यह देखने के लिए देख रहा हूं कि ऐसा करने का कोई तरीका है या फिर भी यह रिश्तेदार है, ताकि इससे कोई फर्क नहीं पड़ता कि निर्देशिका संरचना में f1 (इस उदाहरण में) से ऊपर क्या है। – user1205577

+0

ठीक है आप एक साथ स्ट्रिंग कर सकते हैं ".." उदा। '# शामिल करें ../../../../../../ f2/f3/f4/f5/myFile.cpp' जो बहुत बदसूरत है, मुझे तुरंत इसे लिखने पर खेद है। मैं मेकफ़ाइल में पथ शामिल करने की अनुशंसा करता हूं। – JohnMcG

उत्तर

10

".."#include में डालकर आम तौर पर बदसूरत और अस्पष्ट माना जाता है।

प्रत्येक सुसंगत लाइब्रेरी जिसका आप उपयोग कर रहे हैं (उदाहरण के लिए बूस्ट) में हेडर फाइल पदानुक्रम का एक रूट है जिसे आपको अपनी "अतिरिक्त शामिल निर्देशिका" संपत्ति में रखना चाहिए। को बढ़ावा देने के लिए यह इस निर्देशिका आप आमतौर पर एक निर्देशिका boost जहां हेडर के सभी रहते हैं कहा जाता है खोजने के तहत की तरह

`C:/lib/boost_1_49` 

कुछ है।

#include <boost/bla/bla.hpp> 

यह भी बहुत परियोजना आप लिख रहे हैं के लिए चला जाता है: यह परंपरा है कि सभी को बढ़ावा देने हेडर शुरू के साथ लाता है। आपको यह तय करना चाहिए कि उसके शीर्षकों के लिए सबसे अच्छी जड़ क्या है और वहां से सभी शामिल हैं।
इस नियम का एकमात्र अपवाद हेडर होना चाहिए जो एक ही निर्देशिका में हैं। जिन्हें सिर्फ एक फ़ाइल नाम #include "same-dir-header.h"

के रूप में शामिल किया जा सकता है आपको "" और <> के साथ अंतर भी करना चाहिए। कोट्स आपके प्रोजेक्ट में चीजें होनी चाहिए, कोण ब्रैकेट बाहरी पुस्तकालय (या कुछ के रूप में यह होगा - ओएस और सी रनटाइम लाइब्रेरीज़)

+0

यहां की चाल यह है कि निर्देशिका संरचना अपेक्षाकृत समान होने की गारंटी है, लेकिन मशीन पर जहां पूरी चीज रहती है वह नहीं है। यह एक मेक फ़ाइल की तरह अधिक से अधिक लग रहा है, लेकिन मैं सिर्फ यह जानना चाहता था कि यह भी संभव था या नहीं। – user1205577

+1

यह भी * वास्तव में * गैर पोर्टेबल है। हम एक बार दो कंपाइलरों के साथ काम करने के लिए कोड लिखने की कोशिश कर रहे थे: एक मूल्यांकन किए गए रिश्तेदार '.h' फ़ाइल के स्थान के सापेक्ष '.h' फ़ाइलों में शामिल होते हैं, और दूसरे मूल्यांकन में' .c' फ़ाइल के सापेक्ष शामिल होते हैं । रास्ते शामिल करने का रास्ता शामिल है। मूल समस्या यह है कि निर्देशों में '..' और'/'का अर्थ शामिल है कार्यान्वयन-परिभाषित है। –

0

@Shoosh से जवाब पूरा करने के लिए, आपको अपने कंपाइलर को बताना होगा कि वे कहाँ हैं "अन्य" हेडर फाइलें। खिड़कियों पर जीसीसी के साथ, वे ग में हैं: \ पुस्तकालय

रास्ते में रिक्त स्थान से सावधान रहें करने के लिए \ पथ \: \ पथ \ \ पुस्तकालय के लिए, तो मैं विकल्प

-ic जोड़ने , यह अपने c: \ मेरे पथ \ \ पुस्तकालय, तो करने के लिए:

मैं "c: \ my_path \ to \ पुस्तकालय"

अन्य compilers एक ऐसी ही विकल्प प्रदान करेगा, कमांड लाइन पर या आईडीई के माध्यम से।