2013-02-19 19 views
6

अनुवाद चरण 2 का दूसरा भाग (N3485 में सेक्शन 2.2.2) मूल रूप से कहता है कि अगर एक स्रोत फ़ाइल एक न्यूलाइन चरित्र में समाप्त नहीं होती है, तो संकलक को इसका इलाज करना चाहिए जैसा कि उसने किया था।खाली सी ++ फ़ाइल की उपयोगिता क्या है?

हालांकि, अगर मैं इसे सही तरीके से पढ़ रहा हूं तो यह खाली स्रोत फ़ाइलों के लिए एक स्पष्ट अपवाद बनाता है, जो खाली रहता है।

सटीक पाठ (अतिरिक्त बल के साथ):

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

मैं किसी भी परिस्थिति को समझने में सक्षम नहीं हूं जिसमें कोई फर्क नहीं पड़ता कि स्रोत फ़ाइल खाली थी या केवल एक न्यूलाइन चरित्र शामिल था।

मुझे उम्मीद है कि कोई इस आवश्यकता के पीछे तर्क पर कुछ प्रकाश डाल सकता है।

+1

मैं सही अनुभाग को संदर्भित करने के अपने पोस्ट संपादित (2.2.2) और आसान पढ़ने के लिए वास्तविक पाठ शामिल करें। कृपया ध्यान दें कि आपके द्वारा संदर्भित दस्तावेज़ अंतिम, स्वीकृत मानक नहीं बल्कि एक मसौदा है, यह नहीं कि यह * इस * उदाहरण में महत्वपूर्ण है। –

+1

ठीक है, मैं स्टंप हो गया हूँ। –

+1

उत्पादकता मेट्रिक्स? –

उत्तर

2

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

एक खाली सी ++ स्रोत फ़ाइल विशेष रूप से उपयोगी नहीं है, लेकिन इसे मना करने में कोई बात नहीं है। उद्धृत खंड एक खाली फ़ाइल और केवल एक नई लाइन वाली फ़ाइल के बीच अंतर करने के बारे में नहीं है (उनके बीच कोई वास्तविक अंतर नहीं होना चाहिए)।

+0

मैं सहमत हूं। पाठ कहता है कि कार्यान्वयनकर्ता किसी भी क्रम में बैकस्लैश-न्यूलाइन और '# शामिल' को संसाधित कर सकते हैं, लेकिन परिणाम समान होना चाहिए - भले ही खाली फ़ाइलों और फ़ाइलों की उपस्थिति में केवल एक बैकस्लैश शामिल हो। –

1

प्रीप्रोसेसर का उपयोग प्रोग्राम स्रोत के अलावा चीजों को बनाने के लिए किया जा सकता है, और एक खाली रेखा महत्वपूर्ण हो सकती है - उदाहरण के लिए इसे अक्सर पाठ में पैराग्राफ को अलग करने के लिए उपयोग किया जाता है।

5

यह विशेष रूप से वर्ग "नियमों का सबसे बुरा दुरुपयोग" में अंतरराष्ट्रीय समझ से परे सी कोड प्रतियोगिता में 1994 विजेता प्रविष्टि का समर्थन है: The world's smallest self-replicating program. Guaranteed.

+1

संदिग्ध, क्योंकि उस स्रोत फ़ाइल को अब निष्पादन योग्य नहीं होना चाहिए। –

+0

यह एक फ्रीस्टैंडिंग कार्यान्वयन में मान्य हो सकता है, शायद, "एक कार्यक्रम में मुख्य नामक एक वैश्विक कार्य शामिल होगा, जो प्रोग्राम की नामित शुरुआत है। कार्यान्वयन-कार्य है कि क्या एक फ्रीस्टैंडिंग वातावरण में एक कार्यक्रम की आवश्यकता है एक मुख्य फ़ंक्शन। " –

+0

'gcc-wl, - defsym = _start = _exit -Wl, - अपरिभाषित = _exit -nostartfiles -static -o शून्य शून्य.c' –

2

मैं इसका मतलब है कि हर पंक्ति, \ N के साथ समाप्त होता है, जबकि खाली फ़ाइल कोई लाइनों

+0

आप "लाइन" को कैसे परिभाषित करते हैं? – WiSaGaN

+3

@WiSaGaN: एक उचित परिभाषा "एक या नई लाइन के बाद शून्य या अधिक गैर-न्यूलाइन वर्णों का अनुक्रम" है। फिर यदि किसी फ़ाइल में शून्य या अधिक पंक्तियां होती हैं, तो प्रत्येक गैर-खाली फ़ाइल एक नई पंक्ति में समाप्त होती है। –

0

"एक स्रोत फ़ाइल है कि रिक्त नहीं है और है कि एक नए ऑनलाइन चरित्र में खत्म नहीं होता, या कि है लगता है इस तरह के किसी भी विभाजन के होने से पहले बैकस्लैश चरित्र से पहले एक नए-पंक्ति चरित्र में समाप्त होता है, इस पर संसाधित किया जाएगा जैसे फ़ाइल में एक अतिरिक्त नया-रेखा वर्ण जोड़ा गया था। "

अनुवाद चरण 2 का दूसरा भाग (एन3485 में सेक्शन 2.2.2) मूल रूप से कहता है कि अगर एक स्रोत फ़ाइल एक न्यूलाइन चरित्र में समाप्त नहीं होती है, तो संकलक को इसका इलाज करना चाहिए जैसे कि उसने किया था।

नहीं है - यह कहना है कि अगर फाइल "खाली नहीं है" और एक नई पंक्ति में खत्म नहीं होता है, तो एक नई पंक्ति

जोड़ा जाता है हालांकि, अगर मैं इसे सही ढंग से पढ़ रहा हूँ यह एक बनाता है खाली स्रोत फ़ाइलों के लिए स्पष्ट अपवाद, जो खाली रहते हैं।

सहमत हुए।

मैं किसी भी परिस्थिति को समझने में सक्षम नहीं हूं जिसमें यह एक फर्क पड़ता है कि कोई स्रोत फ़ाइल खाली थी या केवल एक न्यूलाइन चरित्र शामिल थी। मुझे आशा है कि कोई इस आवश्यकता के पीछे तर्क पर कुछ प्रकाश डाल सकता है।

कोई अनुगामी न्यू लाइन साथ नीचे के रूप में एक हैडर अंतिम पंक्ति के साथ "header.h" कहा जाता है फ़ाइल पर विचार करें: इस प्रकार

#endif // #ifndef INCLUDED_HEADER_H 

कहो another.cc यह शामिल हैं:

#include "header.h" 
#include "another.h" 

जब कोई अन्य.सीसी पार्स किया जाता है, तो हेडर एच से टेक्स्ट को इसके समावेशन को निर्दिष्ट करने वाली रेखा के लिए प्रतिस्थापित किया जाता है। भोलेपन से हो गया, कि परिणाम होगा में:

#endif // #ifndef INCLUDED_HEADER_H#include "another.h" 

स्पष्ट, संकलक तो #include "another.h" पर कार्य करने के लिए, यह टिप्पणी header.h में शुरू हो का हिस्सा पर विचार विफल हो जाएगा।

तो, अपूर्ण नियमों के लिए नियम इन समस्याओं से बचाता है (जो स्पॉट करने के लिए बहुत कठिन हो सकता है)।

तो फ़ाइल वैसे भी खाली था, इस समस्या को प्रकट नहीं करता है: #endif सहित फ़ाइल में अगली पंक्ति के लिए prepended जा करने के लिए की तरह कुछ भी नहीं है ....

+0

यह हेडर फ़ाइल नियम (बाद में कुछ वाक्यों) का उल्लंघन कर सकती है कि "एक स्रोत फ़ाइल आंशिक प्रीप्रोकैसिंग टोकन में या आंशिक कॉम- ment में समाप्त नहीं होगी।"जिस तरह से मैं इसे देख रहा हूं, इस तरह की चीज बताती है कि आप एक फाइल में एक नई लाइन क्यों जोड़ना चाहेंगे जो एक में समाप्त नहीं होती है, लेकिन क्यों नहीं कि किसी खाली फ़ाइल को किसी अन्य फ़ाइल की तुलना में अलग तरीके से व्यवहार किया जाना चाहिए एक नई लाइन में समाप्त नहीं होता है। –

+0

@ सैमुएल एडविनवार्ड: "// xxx" आंशिक टिप्पणी नहीं है क्योंकि प्रसंस्करण चरण एक नई लाइन जोड़ते हैं। आंशिक टिप्पणी फॉर्म ".../* ..." है। "[ व्याख्या नहीं करता है] क्यों एक खाली फ़ाइल का अलग-अलग व्यवहार किया जाना चाहिए "... मेरा अंतिम पैराग्राफ बताता है कि - शायद इसे एक और तरीका डालने में मदद मिलेगी: एक खाली फ़ाइल किसी भी सामग्री को अनुवाद इकाई की अगली पंक्ति में अग्रिम करने का जोखिम नहीं उठाती है एक अधूरा लाइन के साथ एक फाइल जिस तरह से .... –