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




language-lawyer c++20 (2)

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

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

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

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

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

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

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

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

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

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

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

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

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


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

__FILE__

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

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

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

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

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





std-source-location