क्या C ++ 20 जनादेश स्रोत कोड फ़ाइलों में संग्रहीत किया जा रहा है?


106

थोड़ा अजीब सवाल है, हालांकि, अगर मुझे सही याद है, तो सी ++ स्रोत कोड को अपनी फ़ाइलों को संग्रहीत करने के लिए एक फ़ाइल सिस्टम की आवश्यकता नहीं है।

एक संकलक जो एक कैमरे के माध्यम से हस्तलिखित पत्रों को स्कैन करता है, एक अनुरूप कार्यान्वयन होगा। हालांकि व्यावहारिक रूप से यह उतना समझ में नहीं आता है।

हालाँकि C ++ 20 अब स्रोत स्थान को साथ जोड़ता है file_name। क्या अब इसका मतलब यह है कि स्रोत कोड हमेशा एक फ़ाइल में संग्रहीत किया जाना चाहिए?


13
यह हमेशा से सी में रहा है - __FILE__। क्लास आपको source_locationकेवल फ़ंक्शन कॉल साइट पर प्राप्त करने की अनुमति देता है।
स्टेसीगर्ल

28
क्या आप अपने हस्तलिखित पत्रों को फ़ाइल नाम नहीं दे सकते हैं?
Jarod42

8
मुझे लगता है कि यह एक कार्यान्वयन विवरण है कि क्या स्रोत कोड फ़ाइलों में है, या कुछ और। यदि संकलक को स्टड के माध्यम से स्रोत कोड खिलाया जा सकता है, तो स्रोत डेटाबेस में हो सकता है।
एलिजय

8
मेरा उदाहरण थोड़ा हटकर हो सकता है, लेकिन अगर आप कुछ ऑन-द-फ्लाई कंपाइलर का उपयोग करते हैं, जैसे कि TCC तो आप हमेशा त्रुटि रिपोर्ट के लिए कुछ मानव पठनीय स्रोत नाम की आपूर्ति कर सकते हैं, भले ही आप सीधे मेमोरी से संकलन करें। "फ़ाइल का नाम" होने का मतलब यह नहीं है कि इसे फ़ाइल के रूप में संग्रहीत नहीं किया जा रहा है।
user7860670

2
निश्चित रूप से यह कार्यान्वयन फ़ाइलें हैं जैसे <iostream> कि फाइलें नहीं हो सकती हैं (यदि आप देखते हैं कि मेरा क्या मतलब है), डेवलपर्स द्वारा लिखित फाइलें नहीं?

जवाबों:


110

नहीं, स्रोत कोड को फ़ाइल से नहीं आना है (न ही किसी फ़ाइल में जाना है)।

आप एक पाइप के भीतर पूरी तरह से C ++ (और लिंक) को संकलित कर सकते हैं, अपने कंपाइलर को मध्य में रख सकते हैं, जैसे

generate_source | g++ -o- -xc++ - | do_something_with_the_binary

और यह दशकों से ऐसा ही है। यह सभी देखें:

std::source_locationC ++ 20 की शुरूआत इस स्थिति को नहीं बदलती है। यह सिर्फ इतना है कि कुछ कोड में एक अच्छी तरह से परिभाषित स्रोत स्थान नहीं होगा (या यह अच्छी तरह से परिभाषित हो सकता है, लेकिन बहुत सार्थक नहीं है)। वास्तव में, मैं कहूंगा कि std::source_locationफ़ाइलों का उपयोग करने को परिभाषित करने का आग्रह थोड़ा मायोपिक है ... हालांकि निष्पक्षता में, यह सिर्फ एक मैक्रो-कम समकक्ष है __FILE__और __LINE__जो पहले से ही सी ++ (और सी) में मौजूद है।

@ HBv6 नोट करता है कि यदि आप __FILE__मानक इनपुट स्ट्रीम से GCC का उपयोग करते समय संकलन का मूल्य प्रिंट करते हैं :

echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++  -

जिसके परिणामस्वरूप निष्पादन योग्य प्रिंट चल रहे हैं <stdin>

सोर्स कोड इंटरनेट से भी आ सकता है।

@Morwenn ध्यान दें कि यह कोड:

#include <https://raw.githubusercontent.com/Morwenn/poplar-heap/master/poplar.h>

// Type your code here, or load an example.
void poplar_sort(int* data, size_t size) {
    poplar::make_heap(data, data + size);
    poplar::sort_heap(data, data + size);
}

GodBolt पर काम करता है (लेकिन आपकी मशीन पर काम नहीं करेगा - कोई भी लोकप्रिय कंपाइलर इसका समर्थन नहीं करता है।)

क्या आप भाषा के वकील हैं? ठीक है, तो चलो मानक से परामर्श करें ।।

यह सवाल कि क्या सी ++ प्रोग्राम स्रोतों को फाइलों से आने की आवश्यकता है, भाषा मानक में स्पष्ट रूप से उत्तर नहीं दिया गया है। C ++ 17 मानक (n4713) के एक मसौदे को देखते हुए, खंड 5.1 [lex.separate] पढ़ता है:

  1. कार्यक्रम का पाठ इस दस्तावेज़ में स्रोत फ़ाइलों नामक इकाइयों में रखा गया है। सभी हेडर (20.5.1.2) और स्रोत फ़ाइलों में शामिल (19.2) प्रीप्रोसेसिंग निर्देश #include के माध्यम से एक स्रोत फ़ाइल, किसी भी सशर्त समावेशन (19.1) प्रीप्रोसेसिंग निर्देशों में से किसी भी स्रोत लाइनों को छोड़ दिया जाता है, इसे अनुवाद इकाई कहा जाता है।

इसलिए, स्रोत कोड को आवश्यक रूप से प्रति फ़ाइल एक फ़ाइल में नहीं रखा जाता है, लेकिन "यूनिट में एक स्रोत फ़ाइल कहा जाता है"। लेकिन फिर, इसमें शामिल कहाँ से आते हैं? एक मान लेंगे कि वे फाइलसिस्टम पर नामित फाइलों से आते हैं ... लेकिन वह भी अनिवार्य नहीं है।

किसी भी दर पर, std::source_locationC ++ 20 में इस शब्द को बदलना या इसकी व्याख्या (AFAICT) को प्रभावित नहीं करता है।


9
वह पाइप मानक के प्रयोजनों के लिए एक "स्रोत फ़ाइल" है।
मेलपोमेने

5
मैं सी मानक को देख रहा हूं, जो परिभाषित करता है: "कार्यक्रम का पाठ इस अंतर्राष्ट्रीय मानक में स्रोत फ़ाइलों , (या प्रीप्रोसेसिंग फ़ाइलों ) नामक इकाइयों में रखा गया है ।" इसलिए जहां भी कोड संग्रहीत किया जाता है, वह मानक में "स्रोत फ़ाइल" है। (परिशिष्ट: इसी तरह की भाषा C ++ मानक में [lex] के अंतर्गत
पाई जाती है

8
@melpomene: इकाइयों को केवल स्रोत फ़ाइलें कहा जाता है , यह नहीं कहता है कि उन्हें वास्तव में स्रोत फ़ाइलें होना चाहिए। लेकिन मैं इसे शामिल करने के उत्तर को संपादित करूंगा।
einpoklum

13
जीसीसी के साथ बस यही कोशिश की: "गूंज '#include <stdio.h> \ nint main () {प्रिंटफ ("% s \\ n ", __FILE__); 1 वापसी;}'; | gcc -o test -xc -" बिना उद्धरण)। निष्पादित होने पर, यह प्रिंट करता है <stdin>।
HBv6

11
यहां मानकों और (विज्ञानों) में शब्दों और नामों और अवधारणाओं के बारे में एक मजेदार बात है: वे आमतौर पर परमाणु हैं। यही है, "स्रोत फ़ाइल" जरूरी "फाइल" नहीं है जो "स्रोत" है, वास्तव में, शब्द "फाइल" को केवल परिभाषित नहीं किया जा सकता है - गणित में संख्याओं के साथ तुलना करें: बस एक "जैसी कोई चीज नहीं है" संख्या ", केवल" प्राकृतिक कक्ष "," परिमेय संख्या "," वास्तविक संख्या ", आदि
जोकर_vD

53

C ++ 20 से पहले भी, मानक पड़ा है:

__FILE__

वर्तमान स्रोत फ़ाइल (एक वर्ण स्ट्रिंग शाब्दिक) का निर्धारित नाम।

परिभाषा इसके लिए समान है source_location::file_name

जैसे, C ++ 20 में फ़ाइल सिस्टम-कम कार्यान्वयन के लिए समर्थन के संबंध में कोई बदलाव नहीं हुआ है।

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


निष्कर्ष में: हाँ, स्रोतों को मानक के रूप में "फाइल" के रूप में संदर्भित किया जाता है, लेकिन "फाइल" क्या है और क्या फाइल सिस्टम शामिल है अनिर्दिष्ट है।


2
@Yisisarvinen मुझे वास्तव में नियम के "अनुमान" योग्यता के इरादे का पता नहीं है, लेकिन मुझे लगता है :) कि यह एक स्पष्टीकरण है कि फ़ाइल नाम doest को निरपेक्ष या विहित करने की आवश्यकता है, बल्कि इसके परिप्रेक्ष्य के सापेक्ष नाम संकलक पर्याप्त है। मै गलत हो सकता हूँ।
एरोरिका

4
मैं बस "वाम-कैबिनेट, तीसरा-दराज, चौथा लाल-वर्जित फ़ोल्डर, पृष्ठ 17"scanner-c++ वापस लौटता हुआ देख सकता हूं ।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

2
FWIW, POSIX अर्थों में, एक पाइप (या कोई अन्य फ़ाइल-ईश चीज़) एक "फ़ाइल" है - जैसे, स्टैडेन / स्टडआउट "फाइलें" हैं, बस इस अर्थ में डिस्क फ़ाइलें आदि नहीं हैं।

3
@ युकसारविन: समिति अक्सर उन स्थितियों के लिए भत्ते बनाती है जहां अस्पष्ट कार्यान्वयन सामान्य कारणों के विपरीत कुछ करने के लिए अच्छे कारण हो सकते हैं। ऐसा करने में, यह कंपाइलर लेखकों पर निर्भर करता है कि वे यह तय करें कि उनके ग्राहक सामान्य व्यवहार को किसी विकल्प से कम या ज्यादा उपयोगी पाएंगे। तथ्य यह है कि इस तरह की चीजों को कार्यान्वयनकर्ताओं के फैसले पर छोड़ दिया जाता है, इसे "अस्पष्टता" के रूप में देखा जा सकता है, लेकिन यह एक जानबूझकर है, क्योंकि अच्छे संकलक लेखकों को अपने ग्राहकों की जरूरतों के बारे में कमेटी की जरूरत से ज्यादा पता चल जाएगा।
सुपरकैट

1
@dmee ... दरवाजे पर एक संकेत के साथ एक अप्रयुक्त शौचालय में 'तेंदुए से सावधान रहें।'
एंड्रयू हेनल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.