2013-08-15 7 views
8

में फ़ाइल को कैसे शामिल करें मेरे पास एक हेडर फ़ाइल है जिसे मैं include प्री-प्रोसेसर निर्देशिका का उपयोग करके किसी अन्य स्रोत फ़ाइल से शामिल करने का प्रयास कर रहा हूं। मैंने उद्धृत रूप के साथ-साथ कोण-ब्रैकेट फॉर्म दोनों का उपयोग करने की कोशिश की है, लेकिन न ही नौकरी करने लगती है।सी और/या सी ++

फ़ाइल का नाम .>"hello.h है और एक निर्देशिका जहां यह संकलक द्वारा खोजी जाती है। मैं इसे इस तरह शामिल करने के लिए प्रयास किया है:

  • #include <.>"hello.h>
  • #include <.\>"hello.h>
  • #include <.\>\"hello.h>
  • #include ".>"hello.h"
  • #include ".>\"hello.h"

मैं भी अलग सी और सी ++ compilers कोशिश की - बजना , जीसीसी , क्लैंग ++ और जी ++।

जाहिर है, उपरोक्त में से कोई भी काम नहीं करता है या अन्यथा कोई प्रश्न नहीं होता।

मैंने सोचा कि शायद मानक मानक के अनुसार कानूनी नहीं है। दुर्भाग्यवश, मेरे पास न तो सी और न ही सी ++ मानक विनिर्देश हैं। मुझे मिली जानकारी का एकमात्र आधिकारिक स्रोत this MSDN पृष्ठ #include निर्देश, और जीएनयू सी प्रीप्रोसेसर दस्तावेज़, here था। जीएनयू के दस्तावेज़ में ज्यादा नहीं कहना है, MSDN निम्नलिखित खंड है, तथापि:

पथ-कल्पना वैकल्पिक रूप से एक निर्देशिका विनिर्देश से पहले एक फ़ाइल नाम है। फ़ाइल नाम को मौजूदा फ़ाइल का नाम देना होगा। का सिंटैक्स पथ-spec ऑपरेटिंग सिस्टम पर निर्भर करता है जिस पर प्रोग्राम संकलित है।

सी और सी ++ मानकों इस बारे में क्या कहते हैं कि मैं जानने के लिए उत्सुक हूँ?

मुझे सी और सी ++ हेडर फ़ाइल नामकरण आवश्यकताओं के लिए उन ओएस-विशिष्ट नियम कहां मिलेंगे? मैं विशेष रूप से ओएस एक्स, लिनक्स और फ्रीबीएसडी में रूचि रखता हूं।

< से बचने और/या " वर्ण क्यों काम नहीं करते हैं?

मैं अपनी फ़ाइल कैसे शामिल करूं?

+0

उम क्या आप 'clang file_one.c file_two.c' का उपयोग करके संकलित कर रहे हैं? ... जो कि आसानी से समस्या हो सकती है। सुनिश्चित नहीं है कि आप यहां क्या हासिल करने की कोशिश कर रहे हैं। –

+4

मुझे पता है कि यह सवाल का जवाब नहीं दे रहा है, लेकिन क्यों नहीं .... फ़ाइल का नाम बदलें? वैसे भी यह बहुत नाम है। – eli

+0

@ जैकोबोलैक: मैं 'क्लैंग ++ -Wall -pedantic -I के रूप में संकलित कर रहा हूं। -std = C++ 11 -stdlib = libC++ -o हैलो।/hello.cc' जहां 'hello.cc' एक फ़ाइल है जहां मुझे '।>" hello.h' शामिल करना होगा। –

उत्तर

10

मुझे लगता है कि आप draft C99 standard अनुभाग 6.4.7 Header names से कि फ़ाइल नाम के साथ भाग्य से बाहर हैं व्याकरण इस प्रकार है:

header-name: 
    < h-char-sequence > 
    " q-char-sequence " 
h-char-sequence: 
    h-char 
    h-char-sequence h-char 
h-char: 
    any member of the source character set except 
    the new-line character and > 
q-char-sequence: 
    q-char 
    q-char-sequence q-char 
q-char: 
    any member of the source character set except 
    the new-line character and " 

आप फ़ाइल नाम है जो आप से दोनों शामिल नहीं में दोनों एक " और > है q-char और h-char विनिर्देशन। मुझे नहीं लगता कि फ़ाइल नाम बदलने के लिए आपके पास बहुत पसंद है।

व्याकरण draft C++ standard, खंड 2.9 Header names में समान है।

+0

धन्यवाद। मैं आपको मानक उद्धृत करने की सराहना करता हूं। सी ++ के लिए आपके पास कोई भी उद्धरण है? –

+0

@VladLazarenko मैं सी ++ के लिए देख रहा हूं लेकिन मुझे पूरा यकीन है कि यह समान है। –

+1

@ShafikYaghmour: यह सी ++ 11 2.9 में है, और शब्द व्यावहारिक रूप से सी 99 के समान है। –

2

"और> विंडोज़ में फ़ाइल नाम के लिए मान्य वर्ण नहीं हैं। आपका फ़ाइल नाम hello.h, या। \ Hello.h, या .. \ hello.h होना चाहिए, लेकिन नहीं।>" Hello.h।

#include "hello.h" 
#include ".\hello.h" 
#include "..\hello.h" 
#include "c:/temp/hello.h" 

यही कारण है कि आपको इसके बारे में एमएसडीएन में कुछ भी नहीं मिलेगा।

ext3 अधिकांश वर्णों को अनुमति देता है (कई को उपयोग किए जाने से बचने की ज़रूरत होती है), लेकिन यह अत्यधिक अनुशंसा की जाती है कि आप अपने हेडर और स्रोत फ़ाइलों का नामकरण करते समय उनका उपयोग न करें (यदि पठनीयता से कोई अन्य कारण नहीं है)।अधिक जानकारी के लिए: http://pic.dhe.ibm.com/infocenter/compbg/v121v141/index.jsp?topic=%2Fcom.ibm.xlcpp121.bg.doc%2Flanguage_ref%2Fc99preprocessor.html

+0

यह विंडोज के लिए सवाल का जवाब देता है। मैं ओएस एक्स का उपयोग कर रहा हूं, हालांकि, मुझे लगता है कि फाइल का नाम कानूनी है क्योंकि यह अस्तित्व में है और मैं इसे पढ़ने के लिए खोल सकता हूं। –

+0

हालांकि सवाल कहता है "मैं विशेष रूप से ओएस एक्स, लिनक्स और फ्रीबीएसडी में रूचि रखता हूं", जो विंडोज के प्रतिबंधों को साझा नहीं करता है। –

+3

मैं _not_ नाम में बैकस्लैश डालूंगा। विंडोज के तहत भी, '# शामिल करें "../ hello.h" 'बहुत सुरक्षित है। –

5

सी और सी ++ दोनों में, यह मान्य हेडर नाम नहीं है क्योंकि इसमें > और " दोनों शामिल हैं।

हेडर नाम का वाक्य विन्यास <> द्वारा सीमांकित उन "स्रोत चरित्र नई लाइन और > को छोड़कर सेट के किसी भी सदस्य" को रोकने के लिए अनुमति देता है, और "" द्वारा सीमांकित उन को रोकने के लिए "को छोड़कर सेट स्रोत चरित्र के किसी भी सदस्य new- लाइन और " "। एक भागने अनुक्रम की कोई अवधारणा नहीं है।

+0

अच्छा बिंदु। एक शामिल में '" ... "एक स्ट्रिंग अक्षर नहीं है, और स्ट्रिंग अक्षर के लिए सामान्य नियमों का पालन नहीं करता है। दूसरी तरफ, मुझे पूरा यकीन है कि भागने की अनुमति है (हालांकि शायद "नहीं), और ऐसे संदर्भ हैं जहां आप एक स्ट्रिंग अक्षर के साथ शुरू कर सकते हैं, और इसे '' q-char- अनुक्रम '" 'मानक कुछ भी स्पष्ट है। –

+0

@ जेम्ससांज: मानक स्पष्ट रूप से व्याकरण को * हेडर-नाम * के लिए निर्दिष्ट करता है - शाकिफ का उत्तर इसे पूर्ण रूप से पुन: उत्पन्न करता है। बचाना, या परिभाषा को बदलने का कोई अन्य तरीका * q-char * या * h-char *, एक गैर-मानक एक्सटेंशन होगा। –

+0

यदि आप एक q-char-sequence का उपयोग करते हैं, तो मैं आपका अधिकार सोचता हूं। अन्य वर्ण बच सकते हैं (चूंकि नाम का अर्थ कैसे लिया जाता है कार्यान्वयन परिभाषित), लेकिन '' '' नहीं। लेकिन समाधान के बारे में क्या मैं 'NAME परिभाषित करें" के साथ प्रस्ताव करता हूं।> \ "हैलो.h", फिर 'NAME को शामिल करें '# परिभाषित करें' में, यह एक" टोकन "है, और यह केवल टोकन का एकमात्र प्रकार है हो सकता है एक स्ट्रिंग शाब्दिक (जहां भागने कानूनी है)? मुझे लगता है कि मानक इस बारे में बहुत अस्पष्ट है। –

0

एक स्वीकार्य फ़ाइल नाम कार्यान्वयन परिभाषित किया गया है। मैं अपेक्षा की होगी #include ".>\"hello.h" to work, at least on systems where '>' and ' "'` फ़ाइल नामों में कानूनी हैं, लेकिन कोई आवश्यकता है कि यह काम नहीं है, और वहाँ स्पष्ट रूप से सिस्टम हैं जहां यह नहीं होगा, क्योंकि इस तरह के नाम प्रणाली में वैध नहीं हैं ।

संभव है कि आप इस मुद्दे को मजबूर कर प्रयास करें:

#define NAME ".>\"hello.h" 
#include NAME 

लेकिन व्यावहारिक उद्देश्यों के लिए, आप अपने फ़ाइल नाम अक्षर या अंक के सीमित रखना चाहिए, अंडरस्कोर और शायद हाइफ़न (लेकिन मैं उन लोगों में से Leary होगा भी)। और एक्सटेंशन से पहले, केवल एक बिंदु के साथ। यदि आप परेशानी की तलाश में हैं, तो पर आपको आश्चर्यचकित न हों।

जो, आपके आखिरी प्रश्न का उत्तर देता है: मैं फ़ाइल को फ़ाइल कैसे शामिल करूं? आप इसे समझदार कुछ मानते हैं।