2012-08-30 16 views
18

मान लीजिए कि मेरे पास टैग MyStruct टैग के साथ पूरी तरह परिभाषित संरचना है, और मान लीजिए कि x, y, ..., z को इसके फ़ील्ड के लिए मानों की अनुमति है। क्योंक्यों structs सीधे असाइन नहीं किया जा सकता है?

struct MyStruct q = {x,y,..,z}; 

अनुमति दी है, लेकिन

struct MyStruct q; 
q = {x,y,...,z}; 

अनुमति नहीं है? मुझे यह बहुत परेशान लगता है। दूसरे मामले में, जहां मैं पहले q घोषणा की है में, मैं एक एक करके प्रत्येक क्षेत्र, एक के लिए एक मूल्य निर्दिष्ट करने की जरूरत है:

q.X = x; q.Y = y; ... q.Z = z; 

जहां X, Y, ..., ZMyStruct के क्षेत्र हैं। क्या इसके पीछे कोई कारण है?

+0

असाइनमेंट की rvalue ठोस नहीं है और इसकी रनटाइम में प्रारंभिक असाइनमेंट कंक्रीट है हालांकि बाइनरी में उपलब्ध है (बीएसएस अनुभाग में सबसे अधिक संभावना है यदि यह एक एल्फ फ़ाइल है)। यदि आप एक-दूसरे को structs असाइन करना चाहते हैं, तो आप प्रारंभिक कुछ को क्यू असाइन कर सकते हैं। पसंद; संरचना MyStruct w = {x, y, .., z}; q = w – sardok

उत्तर

26

क्या आप देख रहे हैं एक यौगिक शाब्दिक है। इसे सी 99 में भाषा में जोड़ा गया था।

आपका पहला मामला:

struct MyStruct q = {x,y,..,z}; 

एक वाक्य रचना प्रारंभ करने के लिए विशिष्ट है। आपका दूसरा मामला, भाषा के पैडेंटिक्स में प्रारंभिक नहीं है, बल्कि असाइनमेंट है। असाइनमेंट के दाएं हाथ की तरफ सही प्रकार की संरचना होनी चाहिए। सी 99 से पहले एक संरचना शाब्दिक लिखने के लिए भाषा में कोई वाक्यविन्यास नहीं था, जो आप करने की कोशिश कर रहे हैं। {x, y, .., z} अंदर एक अभिव्यक्ति के साथ एक ब्लॉक की तरह लग रहा था। यदि कोई इसे शाब्दिक मूल्य के रूप में सोचने की कोशिश करने के लिए प्रेरित था, हालांकि भाषा नहीं थी, तो कोई भी इसके प्रकार के बारे में सुनिश्चित नहीं हो सका। (। अपने संदर्भ में, आप एक अच्छे अनुमान लगाने के लिए कर सकते हैं)

इसकी अनुमति देने के और प्रकार समस्या को हल करने, C99 वाक्य रचना जोड़ा ताकि आप लिख सकते हैं:

q = (struct MyStruct){x,y,...,z}; 
+3

+1 यह निर्दिष्ट करने के लिए कि यह सी 99 है। यह नहीं पता था कि यह संभव था जो शायद इसलिए है क्योंकि हमें पुराने कंपाइलर्स के साथ काम करना है। – Leo

23

आप ऐसा कर सकते हैं, लेकिन आप अपने कुल से पहले संरचना के प्रकार की आपूर्ति करने की जरूरत है:

struct MyStruct q; 
q = (struct MyStruct){x,y,...,z}; 
+0

यहां एक उदाहरण के साथ [ideone का लिंक] (http://ideone.com/rB1Fz) है। – dasblinkenlight

+2

लेकिन केवल सी 99 में (एवी बर्गर का जवाब देखें) – AAT

+0

@ एएटी आप सही हैं, यह एक सुविधा है जिसे सी 99 में जोड़ा गया है। हालांकि, चूंकि सी 99 एक दशक से अधिक समय से आसपास रहा है, इसलिए यह कई संदर्भों में सी के समानार्थी बन गया है। – dasblinkenlight

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