2014-10-14 3 views
7

स्टैंडर्ड अनुरूप सी ++ compilers क्या मानक एक फ़ाइल किया जा रहा संकलित, जैसे है के तहत निर्धारित करने के लिए preprocessing के दौरान एक __cplusplus मैक्रो जो निरीक्षण किया सकता है परिभाषित:इंगित सी ++ एक मानक तरीके से स्रोत में मानक

#if __cplusplus < 201103L 
#error "You need a C++11 compliant compiler." 
#endif 

#include <iostream> 
#include <vector> 

int main(){ 
    std::vector<int> v {1, 2, 3}; 
    for (auto i : v){ 
     std::cout << i << " "; 
    } 
    std::cout << std::endl; 
    return 0; 
} 

मेरा प्रश्न है:

  • वहाँ इंगित करने के लिए एक मानक तरीका है क्या मानक एक स्रोत फ़ाइल के साथ संकलित किया जाना चाहिए?

कि निर्माण उपकरण संकलन से पहले -std= के लिए उपयुक्त तर्क (cf. कुटिया के जो पटकथा भाषा/संस्करण का संकेत कर सकते हैं: #!/usr/bin/env python3) निर्धारित करने के लिए सूत्रों का कहना है का निरीक्षण करने की अनुमति होगी।

एक गैर मानक और भंगुर तरह से मैं के बारे में सोच सकते हैं __cplusplus की पूर्वप्रक्रमक जांच के लिए लेकिन उपरोक्त उदाहरण मैं भी लिख सकता में लग रही है:

#if __cplusplus <= 199711L 
#error "You need a C++11 compliant compiler." 
#endif 

इसलिए, लेखन उदा सभी बदलावों को पकड़ने के लिए एक रेगेक्स काफी मुश्किल हो जाएगा।

संपादित करें:

मैं @Gary द्वारा जवाब जो एक निर्माण प्रणाली पर भरोसा करने का सुझाव, के साथ सहानुभूति हालांकि यह मानता है कि हम वास्तव में एक निर्माण कदम होगा।

लेकिन आप पहले से ही आज कर सकते हैं:

  • उपयोग एक दुभाषिया एक सी उदा का उपयोग कर चलाने के लिए ++ कार्यक्रम CINT
  • या उदाहरण के लिए स्रोत अनुवाद के लिए स्रोत का उपयोग करें rosecompiler

मेरा प्रश्न यह दर्शाता है कि स्रोत C++ है और कौन-सा संस्करण इसके लिए इरादा था (कल्पना किसी को अब से 70 साल मेरे कोड बाहर खुदाई जब सी ++ के रूप में कहते हैं कि आज कोबोल है के रूप में लोकप्रिय हो सकता है) के बारे में भी है ।

मुझे लगता है कि बराबर बात मैं तलाश कर रहा होगा एचटीएमएल के सी ++ equiavlent है: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

+0

ब्याज से बाहर, तुम क्यों परवाह है? यदि आप 98 में संकलित करने वाले कोड को लिखते हैं तो इसे 03 या 11 में संकलित किया जाना चाहिए (आप बहिष्कृत कार्यों का उपयोग कर सकते हैं - संभावित रूप से), लेकिन इसे संकलित करना चाहिए - तो उद्देश्य क्या है? – Nim

+0

@Nim मुझे लगता है कि यह * न्यूनतम संस्करण * फ़ाइल अनुरोधों के बारे में है। – leemes

+0

@leemes, मुझे सवाल पूछने दो, अगर कोई फ़ाइल कहती है कि इसे 98 के साथ संकलित किया जा सकता है, तो क्या इस फ़ाइल के लिए 'std = 'बदल दिया जाता है? यदि नहीं, तो इस दृष्टिकोण से आईएमएचओ का कोई मतलब नहीं है, प्रोजेक्ट लेवल पर आप किस संस्करण का उपयोग कर रहे हैं, और संभावित रूप से पुरानी कंपाइलर्स को संभालने के लिए फ़ाइल में चेक है (अगर यह बहुत पुराना है तो इसे अस्वीकार करने के लिए ...) – Nim

उत्तर

3

एक तरह से सी ++ मानक कुछ हद तक एक पुस्तकालय के खिलाफ विकासशील की तरह हैं। उस अर्थ में, पुस्तकालय आमतौर पर ऐसे तरीके से विकसित होते हैं जो नए कार्यों तक पहुंच बनाने के दौरान धीरे-धीरे पुराने कार्यों को हटा देता है। आम तौर पर पुराने तरीकों तक पहुंच की अनुमति देते हुए नए तरीकों या हस्ताक्षरों का परिचय है।

उदाहरण के लिए, आप आईफोन के लिए एक ऐप बना सकते हैं जो आईओएस 4 और उसके बाद के संस्करण के साथ संगत है। आपको चेरी चुनने का विकल्प नहीं मिलता है कि आप कौन से विशिष्ट संस्करणों का समर्थन करना चाहते हैं।यह अच्छा है क्योंकि अन्यथा आप संभावनाओं के एक मैट्रिक्स तक कोड विकास को खोलते हैं, जिससे आपके कोड को समझने और बनाए रखने में कठिनाई होती है।

वैकल्पिक रूप से, आप कुछ प्रकार के संस्करण या ध्वज के आधार पर सशर्त रूप से कुछ टुकड़े बनाने के लिए प्रीप्रोसेसर निर्देश पेश कर सकते हैं। ये अस्थायी उपाय हैं, हालांकि, कोड विकसित होने के बाद हटा दिया जाना चाहिए।

तो मुझे लगता है कि इस सवाल का जवाब देने के लिए बेहतर सवाल यह है कि इस स्थिति में खुद को क्या पूछना है, यह वास्तव में हल करने जैसा कुछ जोड़ देगा और क्या यह अनावश्यक जटिलता (खराब डिजाइन की कोड गंध में से एक) जोड़ देगा?

इस स्थिति में और अनुभव से, मुझे व्यक्तिगत रूप से लगता है कि आप एक मानक के साथ बेहतर चिपके हुए हैं। मुझे लगता है कि आप पाएंगे कि विभिन्न प्रीप्रोसेसर #ifdef और #ifndefs छिड़ककर मानकों को अलग करने की कोशिश कर रहा है, जो आपके कोड आधार को समझने और प्रबंधित करने में मुश्किल समझने जा रहा है। यहां तक ​​कि यदि आपके पास फ़ाइल में सभी अन्य फ़ाइलों द्वारा शामिल किए जाने वाले संस्करण की परिभाषा के साथ फ़ाइल शामिल है, तो यह प्रबंधित करने के लिए अभी तक एक और फ़ाइल बन जाती है .... जब आप इसे बदलते हैं तो इसका उल्लेख नहीं करना है, आपको इसे शामिल करने वाली सभी चीज़ों को फिर से सम्मिलित करना होगा।

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

इसके अलावा, अगर वे अपने रास्ते से हट जाने के लिए और गलत मानक के साथ संकलन, वे संकलक त्रुटियों के बहुत सारे के साथ स्वागत किया जाएगा =)

संबंधित मुद्दे