c++ - Field name same as field type using unnamed namespace -
कोड के इस नमूने पर विचार करें:
#include & lt; iostream & gt; नामस्थान / * अनाम नामस्थान * / {struct Foo {int a; Int b; }; } संरचना बू {फु फू; / * फ़ील्ड का नाम फ़ील्ड प्रकार * / int c; शून्य प्रिंट (); }; शून्य बो :: प्रिंट () {std :: cout & lt; & lt; "c =" & lt; & lt; c & lt; & lt; std :: endl; Std :: cout & lt; & lt; "Foo" & lt; Foo.a & lt; & lt; "" & lt; & lt; Foo.b & lt; & lt; std :: endl; } Int main () {बू बू; boo.c = 30; boo.Foo.a = -21; boo.Foo.b = 98; boo.print (); वापसी 0; } रीलैंक बिना त्रुटियों को संकलित कर सकता है।
डेबियन कालान संस्करण 3.5.0-9 (टैग / रिलीज़ XXX50 / अंतिम) (एलएलबीएम 3.5.0 पर आधारित) < / P>
माइक्रोसॉफ्ट cl.exe त्रुटियों के बिना इसे संकलित करें (मुझे संस्करण याद नहीं है। मैं वीएस 2012 का उपयोग करता हूं)
और जीसीसी: जीसीसी संस्करण 4.9.2 (डेबियन 4.9.2-10):
main.cpp : 14: 6: त्रुटि: '{अनाम} के घोषणापत्र: फू बू: फू [-फिपर्मिसिव] फु फू; / * फ़ील्ड का नाम फ़ील्ड प्रकार * / ^ main.cpp: 5: 9: त्रुटि: 'struct {anonymous} :: Foo' [- fpermissive] struct 'Foo' से संबंधित 'Foo' का अर्थ Foo ^ कंपाइलर का अच्छा व्यवहार क्या है? क्यों जीसीसी इसे संकलित नहीं कर सकता, लेकिन झूठी और cl.exe करता है? क्या सी ++ मानक कहते हैं?
दोनों सही हैं प्रति §3.3.7 / 1
निम्नलिखित नियम वर्गों में घोषित नामों के दायरे का वर्णन करते हैं।
<..
एक वर्ग <कोड> एस <में इस्तेमाल किया नाम
N/ कोड> इसके संदर्भ में एक ही घोषणा का संदर्भ लेंगे और जबSके पूर्ण दायरे में पुनः मूल्यांकन किया जाएगा। इस नियम के उल्लंघन के लिए कोई निदान आवश्यक नहीं है।
कोई भी त्रुटि देने के लिए ज़िम्मेदार नहीं है, जीसीसी ने चुना और झगड़ा जाहिरा तौर पर नहीं चुना। यह किसी भी तरह के अनुरूप है।
Comments
Post a Comment