मेरे व्याख्याता द्वारा लिखी गई सभी सी फाइलें पहली पंक्ति में एक # के साथ क्यों शुरू होती हैं?


431

मैं कुछ सी कोर्स नोट्स के माध्यम से जा रहा हूं, और प्रत्येक सी प्रोग्राम स्रोत फ़ाइल प्रोग्राम #की पहली पंक्ति पर एकल के साथ शुरू होती है ।

फिर रिक्त रेखाएँ होती हैं, और mainफ़ंक्शन द्वारा अनुसरण किए जाने वाले अन्य सामान का अनुसरण करते हैं।

इसका कारण क्या है #?

(यह अब समाप्त हो गया है और मैं वास्तव में चैप से नहीं पूछ सकता।)

यहाँ एक उदाहरण है:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}


3
मैंने पाठ्यक्रम के नोट्स में पहला उदाहरण दिया। शाब्दिक रूप से एक है #, फिर एक रिक्त रेखा, फिर कार्यक्रम।
मेन मैन

30
खाली #का मुख्य उद्देश्य ओफिसकेशन है। यदि आप सभी को बाहर से भ्रमित करना चाहते हैं, तो आप उदाहरण के लिए अपने सभी स्रोत फ़ाइलों को लाइन के साथ शुरू कर सकते हैं #//#BEGIN#\\#(जो बिल्कुल कुछ नहीं करता है)।
लुंडिन

3
@ बाथशीबा शायद यह इन लोगों में से एक है। cl.cam.ac.uk/people/academy.html
टायलरएच

7
@Bathsheba उस आखिरी स्टैम्प पर समय टिकता है जिसे आपने प्रश्न पूछने के एक मिनट बाद ही यथोचित विस्तृत उत्तर दे दिया था, जो C99 संदर्भ मानक के एक प्रासंगिक उद्धरण के साथ पूरा हुआ। आप निश्चित रूप से एक षड्यंत्रकारी व्यक्ति हैं। संभवतः इलुमिनाती में। हालांकि दोनों प्रश्न आखिर इतने लोकप्रिय कैसे होंगे?
नेट

जवाबों:


614

वाह, यह आवश्यकता 1970 के दशक में वापस जाती है ।

में बहुत जल्दी पूर्व मानकीकृत सी के दिनों में, यदि आप आह्वान करना चाहता था पूर्वप्रक्रमक , तो आप एक लिखना पड़ा #एक स्रोत फ़ाइल की पहली पंक्ति में पहली बात यह है के रूप में। लेखन केवल एक #फ़ाइल के शीर्ष पर अन्य पूर्वप्रक्रमक निर्देशों की नियुक्ति में लचीलापन मिलता।

से महान डेनिस खुद रिची द्वारा एक मूल सी मसौदा :

12. संकलक नियंत्रण रेखाएँ

[...] आदेश देने के लिए [] प्रीप्रोसेसर को लागू करने के लिए, यह आवश्यक है कि कार्यक्रम की पहली पहली पंक्ति # के साथ शुरू हो। चूंकि अशक्त लाइनों को प्रीप्रोसेसर द्वारा अनदेखा किया जाता है, इसलिए इस लाइन में कोई अन्य जानकारी नहीं है।

यह दस्तावेज़ महान पढ़ने के लिए बनाता है (और मुझे इस सवाल पर पागल बिल्ली की तरह कूदने की अनुमति देता है)।

मुझे संदेह है कि यह व्याख्याता केवल भावुक है - यह निश्चित रूप से एएनएसआई सी के बाद से आवश्यक नहीं है।


22
जैसा कि मैं इसे समझता हूं, आवश्यकता यह नहीं है कि बहुत पहले चरित्र को #अपने आप में एक लाइन पर होना चाहिए , बस यह एक से शुरू होता है #, इसलिए सीधे एक के लिए क्यों नहीं #include? या मैं इसे गलत समझ रहा हूं?
फेडेरिको क्लेज़ कुल्लोका

14
@ बाथशीबा " इस प्रीप्रोसेसर को लगाने का कारण बनने के लिए, यह आवश्यक है कि कार्यक्रम की पहली पहली पंक्ति # के साथ शुरू हो। चूंकि नेल लाइनों को प्रीप्रोसेसर द्वारा नजरअंदाज किया जाता है, इस लाइन में कोई अन्य जानकारी नहीं है। " - इसलिए - कर सकते हैं पहले से ही एक पूर्वप्रक्रमक निर्देश होते हैं, लेकिन यह आवश्यक नहीं है ....

5
जब मैंने C (1980) में प्रोग्रामिंग शुरू की थी तब यह कोई आवश्यकता नहीं थी। ANSI C को 1989 तक मानकीकृत नहीं किया गया था।
पूजो-पुरुष

29
@ federico-klez-culloca यदि यह शामिल हो जाता है, तो फ़ाइल बिना किसी अग्रणी # के समाप्त हो सकती है, क्योंकि भविष्य में कोई भी किसी गैर-जरूरी को हटा देता है, जबकि प्रमुख # के दुष्प्रभावों से अनजान होता है।
फादवे

4
@ कसानोवा - नहीं। ऐसा करने और इस तरह के जवाब को स्वीकार करने से साइट के नियमों का उल्लंघन होता है। यदि आप मेरा अर्थ प्राप्त करते हैं, तो अलग-अलग खातों के तहत पूछना और जवाब देना आपसी वोटिंग के बिना भी साइट के नियमों की भावना के खिलाफ है। अपने स्वयं के प्रश्न का उत्तर देने और उस उत्तर को स्वीकार करने में कोई बुराई नहीं है, हालांकि उसी खाते के साथ - मैंने अतीत में ऐसा किया है।
बाथशीबा

1

कुछ नहीं करता

C / C ++ के ISO मानक के अनुसार:

प्रपत्र का एक पूर्वप्रक्रमक निर्देश

# new-line

कोई प्रभाव नहीं है।

इसलिए आज के कंपाइलरों में, खाली हैश कुछ भी नहीं करता है (जैसे- new-line ;कोई कार्यक्षमता नहीं है)।


पुनश्च : पूर्व-मानकीकृत सी में , # new-lineएक महत्वपूर्ण भूमिका थी, इसका उपयोग सी प्री-प्रोसेसर (जैसा कि @Bathsheba द्वारा बताया गया है) को आह्वान करने के लिए किया गया था। तो, यहाँ कोड या तो उस समय अवधि के भीतर लिखा गया था, या आदत से आया था।


-5

आपको सी की संकलन प्रक्रिया के बारे में जानने की आवश्यकता है। क्योंकि "पता होना चाहिए" कि स्रोत कोड निष्पादन योग्य बाइनरी कोड (फ़ाइल) में कैसे परिवर्तित होता है।

संकलन प्रक्रिया से, सी सोर्स कोड को प्री-प्रोसेसर सेक्शन को पार करना होता है। लेकिन कोड को पूर्व-प्रक्रिया करने के लिए संकलक को कैसे बताया जाए? ... उस समय # प्रतीक को संकलक के लिए प्रीप्रोसेस के संकेतक के लिए पेश किया गया था।

उदाहरण के #define PI 3.141लिए स्रोत कोड में है। फिर प्रीप्रोसेसिंग सत्र के बाद इसे बदल दिया जाएगा। मतलब, सभी पीआई 3.141 में बदल दिए जाएंगे।

यह पसंद है #include <stdio.h>, मानक I / O फ़ंक्शंस को आपके स्रोत कोड में जोड़ा जाएगा।

यदि आपके पास लिनक्स मशीन है, तो संकलन करें gcc -save-temps source_code.c। और कंपाइलर आउटपुट देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.