जो संरचना आप लौट रहे हैं वह अज्ञात संरचना नहीं है। सी मानक एक अज्ञात संरचना को किसी अन्य संरचना के सदस्य के रूप में परिभाषित करता है जो टैग का उपयोग नहीं करता है। आप जो भी लौट रहे हैं वह एक टैग के बिना एक संरचना है, लेकिन चूंकि यह सदस्य नहीं है, यह अज्ञात नहीं है। टैग के बिना संरचना को इंगित करने के लिए जीसीसी < अज्ञात> नाम का उपयोग करता है।
मान लें कि आप फ़ंक्शन में एक समान संरचना घोषित करने का प्रयास करते हैं।
struct { int x, y; } foo(void)
{
return (struct { int x, y; }){ 0 } ;
}
जीसीसी इसके बारे में शिकायत: जब प्रकार लौटने असंगत प्रकार '< गुमनाम struct>' लेकिन 'struct < गुमनाम>' उम्मीद थी
जाहिर प्रकार संगत नहीं हैं। स्टैंडर्ड में देख रहे हैं हम देखते हैं कि:
6.2.7 संगत प्रकार और समग्र प्रकार
1: दो प्रकार संगत प्रकार है अगर उनके प्रकार एक ही हैं। यह निर्धारित करने के लिए अतिरिक्त नियम हैं कि दो प्रकार के संगत हैं टाइप प्रकार विनिर्देशकों के लिए 6.7.2 में, टाइप क्वालीफायर के लिए 6.7.3 में, और घोषणाकर्ताओं के लिए 6.7.6 में वर्णित हैं। इसके अलावा, अलग-अलग अनुवाद इकाइयों में घोषित दो संरचना, संघ, या समेकित प्रकार संगत हैं यदि उनके टैग और सदस्य निम्न आवश्यकताओं को पूरा करते हैं: यदि किसी को टैग के साथ घोषित किया जाता है, तो दूसरे को एक ही टैग के साथ घोषित किया जाएगा।यदि दोनों अपनी संबंधित अनुवाद इकाइयों के भीतर कहीं भी पूरा हो जाते हैं, तो निम्नलिखित अतिरिक्त आवश्यकताएं लागू होती हैं: उनके सदस्यों के बीच एक-एक-एक पत्राचार होगा कि संबंधित सदस्यों की प्रत्येक जोड़ी संगत प्रकारों के साथ घोषित की जाती है; यदि जोड़ी के एक सदस्य को संरेखण विनिर्देशक के साथ घोषित किया जाता है, तो दूसरे को समकक्ष संरेखण विनिर्देशक के साथ घोषित किया जाता है; और यदि जोड़ी के एक सदस्य को नाम के साथ घोषित किया जाता है, तो दूसरे को उसी नाम से घोषित किया जाता है। दो संरचनाओं के लिए, संबंधित सदस्यों को उसी क्रम में घोषित किया जाएगा। दो संरचनाओं या संघों के लिए, संबंधित बिट-फ़ील्ड में समान चौड़ाई होगी। दो गणनाओं के लिए, संबंधित सदस्यों के समान मूल्य होंगे।
दूसरा बोल्ड हिस्सा बताता है कि यदि दोनों संरचना टैग के बिना हैं, जैसे कि इस उदाहरण में, उन्हें उस भाग के बाद सूचीबद्ध अतिरिक्त आवश्यकताओं का पालन करना होगा, जो वे करते हैं। लेकिन यदि आप पहले बोल्ड हिस्से को देखते हैं तो उन्हें अलग-अलग अनुवाद इकाइयों में होना चाहिए, उदाहरण में structs नहीं हैं। इसलिए वे संगत नहीं हैं और कोड मान्य नहीं है।
:
इसके बाद से यदि आप एक struct घोषित करने और इस समारोह में इसका इस्तेमाल करते हैं, तो आप एक टैग है, जो नियम है कि दोनों structs ही टैग करना है का उल्लंघन करता है का उपयोग करने के कोड सही बनाने के लिए असंभव है
struct t { int x, y; } ;
struct { int x, y; } foo(void)
{
struct t var = { 0 } ;
return var ;
}
फिर जीसीसी की शिकायत: असंगत प्रकार जब प्रकार 'struct टी', लेकिन लौटने 'struct < गुमनाम>' उम्मीद थी
यह की तरह लगता है सख्त यह त्रुटि दे रहा है gcc.With C99 के कुछ हैक http://ideone.com/665vM2 – Ankur
@Shan: फ़ंक्शन परिभाषा वाक्यविन्यास अभी भी कानूनी है। यह केवल गायब रिटर्न स्टेटमेंट के बारे में शिकायत करता है (और मेरा प्रश्न पूछता है कि इस स्थिति में सही रिटर्न स्टेटमेंट कैसे करें)। – Askaga
सी 99 में अज्ञात structs जैसी कोई बात नहीं है। आप _compound literal_ बना सकते हैं लेकिन उनके पास हमेशा स्थानीय दायरा होता है। – Lundin