ट्रिग्राफ गिरा दिया
स्रोत फ़ाइलों को एक भौतिक वर्ण सेट में एन्कोड किया गया है जिसे कार्यान्वयन-परिभाषित तरीके से स्रोत वर्ण सेट में मैप किया गया है , जो मानक में परिभाषित है। मूल चरित्र सेट द्वारा आवश्यक मूल रूप से विराम चिह्न के सभी भौतिक वर्ण सेटों से मैपिंग को समायोजित करने के लिए, भाषा ने ट्रिग्राफ परिभाषित किया- तीन सामान्य वर्णों के अनुक्रम जिन्हें एक कम सामान्य विराम चिह्न वर्ण के स्थान पर उपयोग किया जा सकता है। इन्हें संभालने के लिए प्रीप्रोसेसर और कंपाइलर की आवश्यकता थी।
सी ++ 17 में, ट्रिग्राफ हटा दिए गए थे। इसलिए कुछ स्रोत फ़ाइलों को नए संकलक द्वारा स्वीकार नहीं किया जाएगा, जब तक कि उन्हें पहली बार किसी अन्य भौतिक चरित्र सेट से भौतिक चरित्र सेट से अनुवादित नहीं किया जाता है, जो कि एक-से-एक स्रोत स्रोत सेट पर मैप करता है। (व्यवहार में, अधिकांश कंपाइलरों ने केवल ट्रिग्राफ की व्याख्या को वैकल्पिक बना दिया है।) यह एक सूक्ष्म व्यवहार परिवर्तन नहीं है, लेकिन एक ब्रेकिंग परिवर्तन पूर्व-स्वीकार्य स्रोत फ़ाइलों को बाहरी अनुवाद प्रक्रिया के बिना संकलित होने से रोकता है।
पर और अधिक अड़चनें char
मानक निष्पादन चरित्र सेट को भी संदर्भित करता है , जिसे कार्यान्वयन परिभाषित किया गया है, लेकिन इसमें कम से कम संपूर्ण स्रोत वर्ण सेट और कम संख्या में नियंत्रण कोड होने चाहिए।
C ++ मानक char
को संभवतः-अहस्ताक्षरित अभिन्न प्रकार के रूप में परिभाषित किया गया है जो निष्पादन वर्ण सेट में प्रत्येक मान को कुशलता से दर्शा सकता है। भाषा के वकील से प्रतिनिधित्व के साथ, आप तर्क दे सकते हैं कि char
कम से कम 8 बिट होना चाहिए।
यदि आपका कार्यान्वयन इसके लिए एक अहस्ताक्षरित मान का उपयोग करता है char
, तो आप जानते हैं कि यह 0 से 255 तक हो सकता है, और इस प्रकार हर संभव मूल्य के भंडारण के लिए उपयुक्त है।
लेकिन अगर आपका कार्यान्वयन एक हस्ताक्षरित मूल्य का उपयोग करता है, तो इसके पास विकल्प हैं।
ज्यादातर दो-पूरक का उपयोग करेगा, char
न्यूनतम -128 की सीमा 127 को देगा। यह 256 अद्वितीय मूल्य है।
लेकिन एक अन्य विकल्प था साइन + परिमाण, जहां एक बिट यह बताने के लिए आरक्षित है कि संख्या नकारात्मक है और अन्य सात बिट्स परिमाण को दर्शाते हैं। यह char
-127 से 127 तक की सीमा देगा , जो केवल 255 अद्वितीय मान है। (क्योंकि आप -0 का प्रतिनिधित्व करने के लिए एक उपयोगी बिट संयोजन खो देते हैं।)
मुझे यकीन नहीं है कि समिति ने स्पष्ट रूप से इसे एक दोष के रूप में निर्दिष्ट किया है, लेकिन यह इसलिए था क्योंकि आप मानक से एक गोल-यात्रा की गारंटी देने के लिए मानक पर भरोसा नहीं कर सकते unsigned char
थे char
और वापस मूल मूल्य को संरक्षित करेंगे। (व्यवहार में, सभी कार्यान्वयनों ने किया क्योंकि वे सभी हस्ताक्षरित अभिन्न प्रकारों के लिए दो के पूरक का उपयोग करते थे।)
केवल हाल ही में (C ++ 17?) राउंड-ट्रिपिंग सुनिश्चित करने के लिए निश्चित किया गया शब्द था। यह ठीक है, अन्य सभी आवश्यकताओं के साथ char
, प्रभावी रूप से char
बिना स्पष्ट रूप से हस्ताक्षर किए दो के पूरक को अनिवार्य रूप से बताता है (भले ही मानक अन्य हस्ताक्षरित अभिन्न प्रकारों के लिए संकेत + परिमाण प्रतिनिधित्व की अनुमति देता है)। सभी हस्ताक्षरित अभिन्न प्रकारों के लिए दो के पूरक का उपयोग करने की आवश्यकता के लिए एक प्रस्ताव है, लेकिन मुझे यह याद नहीं है कि क्या इसे सी ++ 20 में बनाया गया था।
तो यह जो आप देख रहे हैं उसके विपरीत की तरह है क्योंकि यह पहले से गलत रूप से अनुमानित कोड को पूर्वव्यापी तय करता है।