2009-12-11 11 views
5

मेरे पास एक संरचना है:क्या यह एक यौगिक शाब्दिक में एक अनाम संघ असाइन करने के लिए संभव (कानूनी) है?

typedef struct _n 
{ 
    int type; 
    union { 
     char *s; 
     int i; 
    }; 
} n; 

जब मैं एक यौगिक शाब्दिक असाइन करने का प्रयास करता हूं, जैसे:

node n1 = {1, 0}; 
node n2 = {2, "test"}; 

gcc मुझे कुछ चेतावनियां देता है जैसे:

warning: initialization makes pointer from integer without a cast 
warning: initialization from incompatible pointer type 

ठीक है, यह स्पष्ट है कि संकलक मेरे बारे में निश्चित रूप से एक संभवतः संदिग्ध प्रकार के लिए एक मूल्य असाइन करने के बारे में निश्चित नहीं है। हालांकि, अगर मैं अधिक सटीक निर्दिष्ट करने का प्रयास करता हूं:

node n0 = {type: 1, i: 4}; 

मुझे मिलता है:

error: unknown field ‘i’ specified in initializer 

मैंने पढ़ा है कि अगर मैं i: से पहले (union <union name>) डालता हूं तो यह काम कर सकता है। हालांकि, मुझे एक अनाम संघ होना पसंद है। क्या इसे करने का कोई तरीका है?

उत्तर

7

बेनामी यूनियन मानक सी नहीं हैं - वे एक कंपाइलर एक्सटेंशन हैं। मैं संघ को एक नाम देने की दृढ़ता से अनुशंसा करता हूं। आप एक गुमनाम संघ के प्रयोग पर जोर देते हैं, तो आप केवल इसके बारे में पहले तत्व के लिए एक प्रारंभकर्ता दे सकते हैं:

node n0 = {1, 0}; // initializes `s' to 0 

जब -Wall -Wextra -pedantic साथ संकलित, जीसीसी मुझे चेतावनी "लापता प्रारंभकर्ता आसपास ब्रेसिज़" है, जो एक है दे दी है वैध चेतावनी प्रारंभकर्ता वास्तव में इस तरह निर्दिष्ट किया जाना चाहिए:

node n0 = {1, {0}}; // initializes `s' to 0 

अब यह केवल एक चेतावनी है कि "आईएसओ सी अनाम structs/यूनियनों का समर्थन नहीं करता" देता है।

आप संघ को कोई नाम दें, तो आप नामित initializers नामक एक C99 सुविधा संघ की एक विशिष्ट सदस्य प्रारंभ करने में उपयोग कर सकते हैं:

typedef struct 
{ 
    int type; 
    union { 
     char *s; 
     int i; 
    } value; 
} node; 

node n0 = {1, { .s = "string"; }}; 
node n1 = {2, { .i = 123; }}; 

आप संघ की जरूरत है एक नाम है करने के लिए; अन्यथा, संकलक इसके अंदर नामित प्रारंभकर्ता के बारे में शिकायत करेगा।

सिंटैक्स जिसे आप node n0 = {type: 1, i: 4} का उपयोग करने का प्रयास कर रहे थे, अमान्य वाक्यविन्यास है; ऐसा लगता है कि आप नामित प्रारंभकर्ताओं का उपयोग करने की कोशिश कर रहे थे।

+0

मुझे पहली बार आश्चर्य हुआ कि मैंने इसे देखा, लेकिन जीसीसी को वास्तव में कानूनी (हालांकि बहिष्कृत) नामित प्रारंभिक वाक्यविन्यास है। – ephemient

+0

कि (मुझे लगता है कि बहिष्कृत) प्रारंभकर्ता वाक्यविन्यास मुझे कुछ कर्नेल मॉड्यूल कोड पढ़ने से मिला है .. 'fops' संरचनाओं को अक्सर इस तरह लिखा जाता है। मैं अब सी 99 रास्ते पर स्विच करूंगा। अज्ञात यूनियनों के बारे में बहुत बुरा, मुझे नहीं पता था कि वे मानक नहीं थे, मेरे लिए इसे साफ़ करने के लिए धन्यवाद। – Steve

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