अंतिम निष्कर्ष: एक पर गणित void*
है अवैध दोनों C और C ++ में।
जीसीसी इसे एक विस्तार के रूप में अनुमति देता है, अंकगणित परvoid
देखें - और फ़ंक्शन-पॉइंटर्स (ध्यान दें कि यह अनुभाग मैनुअल के "सी एक्सटेंशन्स" अध्याय का हिस्सा है)। क्लैंग और आईसीसी संभावना void*
जीसीसी के साथ संगतता के प्रयोजनों के लिए अंकगणित की अनुमति देते हैं । अन्य संकलक (जैसे कि MSVC) अंकगणित को अस्वीकार कर देते हैं void*
, और यदि -pedantic-errors
ध्वज निर्दिष्ट किया जाता है, या यदि -Werror-pointer-arith
ध्वज निर्दिष्ट किया गया है, तो GCC इसे अस्वीकार कर देता है (यदि ध्वज आपके कोड आधार भी MSVC के साथ संकलित होना चाहिए)।
सी मानक बोलती है
उद्धरण एन 1256 ड्राफ्ट से लिए गए हैं।
अतिरिक्त ऑपरेशन के मानक का वर्णन बताता है:
6.5.6-2: इसके अलावा, या तो दोनों ऑपरेंड में अंकगणित प्रकार होंगे, या एक ऑपरेंड एक ऑब्जेक्ट प्रकार के लिए एक संकेतक होगा और दूसरे में पूर्णांक प्रकार होगा।
तो, यहाँ सवाल यह है कि क्या void*
एक "ऑब्जेक्ट प्रकार" के लिए एक संकेतक है, या समकक्ष, void
एक "ऑब्जेक्ट प्रकार" है या नहीं। "ऑब्जेक्ट प्रकार" की परिभाषा है:
6.2.5.1: प्रकारों को ऑब्जेक्ट प्रकारों में विभाजित किया जाता है (प्रकार जो वस्तुओं का पूरी तरह से वर्णन करते हैं), फ़ंक्शन प्रकार (प्रकार जो कार्यों का वर्णन करते हैं), और अपूर्ण प्रकार (प्रकार जो वस्तुओं का वर्णन करते हैं लेकिन उनके आकारों को निर्धारित करने के लिए आवश्यक जानकारी का अभाव है)।
और मानक के void
रूप में परिभाषित करता है:
6.2.5-19: void
प्रकार में मूल्यों का एक खाली सेट शामिल है; यह एक अपूर्ण प्रकार है जिसे पूरा नहीं किया जा सकता है।
चूंकि void
एक अधूरा प्रकार है, यह एक वस्तु प्रकार नहीं है। इसलिए यह एक अतिरिक्त ऑपरेशन के लिए एक वैध ऑपरेंड नहीं है।
इसलिए आप पॉइंटर पर अंकगणित नहीं कर सकते void
।
टिप्पणियाँ
मूल रूप से, यह सोचा गया था कि void*
सी मानक के इन वर्गों के कारण अंकगणित की अनुमति थी:
6.2.5-27: शून्य के लिए
एक पॉइंटर में एक चरित्र प्रकार के लिए एक पॉइंटर के रूप में एक ही प्रतिनिधित्व और संरेखण आवश्यकताएं होंगी ।
तथापि,
समान प्रतिनिधित्व और संरेखण
आवश्यकताओं का तात्पर्य विनिमेयता के रूप में कार्य के तर्कों, कार्यों से मूल्यों को वापस करने और यूनियनों के सदस्यों से है।
तो इसका मतलब यह है कि printf("%s", x)
एक ही अर्थ है कि क्या x
प्रकार है char*
या void*
, लेकिन इसका मतलब यह नहीं है कि आप अंकगणित कर सकते हैं ए void*
।
संपादक का ध्यान दें: यह उत्तर अंतिम निष्कर्ष को दर्शाने के लिए संपादित किया गया है।