2010-01-27 17 views
14

के लिए निम्न कोड एक निरंतर कास्टिंग:एक संघ

#include <stdio.h> 

typedef union { 
    int n; 
    char *s; 
} val_t; 

int main(void) { 
    val_t v1,v2; 

    v1 = (val_t)"Hello World"; 
    v2 = (val_t)10; 

    printf("%s %d\n", v1.s, v2.n); 
    return(1); 
} 

compiles और जीसीसी के साथ सही ढंग से निष्पादित करता है। यदि कोई निरंतर डालने का प्रयास करता है जिसके लिए संघ में उपयुक्त क्षेत्र नहीं है, तो एक त्रुटि संदेश उत्पन्न होता है।

(सी 99) मानक को देखते हुए, हालांकि, मैं उस अनुभाग का पता लगाने में सक्षम नहीं हूं जहां इस व्यवहार का वर्णन किया गया है। इसलिए, मेरा प्रश्न:

क्या सी मानक गारंटी देता है कि मैं एक यूनियन प्रकार के लिए स्थिर बना सकता हूं, बशर्ते संघ के प्रकार में एक संगत प्रकार वाला क्षेत्र हो?

या दूसरे शब्दों में:

((val_t)10) प्रकार val_t का एक मान्य rvalue है?

यह भी अगर यह व्यवहार अन्य compilers (या कम से कम एमएस विजुअल C++) द्वारा समर्थित है जानना दिलचस्प होगा। क्या कोई जानता है?

संपादित करें: संघ में कास्टिंग एक जीसीसी एक्सटेंशन है, इसलिए इसका उपयोग करना एक अच्छा विचार नहीं है।

मॉरीट्स और नील के लिए धन्यवाद! मैंने जांच करने के लिए -पिकैंटिक का उपयोग करने के बारे में नहीं सोचा था!

+1

तथ्य यह है कि यह बहुत खराब प्रोग्रामिंग अभ्यास की तरह दिखता है, यह एक दिलचस्प सवाल है। मैंने सोचा कि सी प्रोग्रामिंग के 20 वर्षों के बाद मैंने इसे सब देखा है, जाहिर है नहीं :) –

+1

@ मॉरिट्रिज यह वास्तव में सी में जेनेरिक कंटेनर को लागू करने का एक शानदार तरीका है। आप कंटेनर की कुंजी को यूनियन प्रकार जैसे फ़ील्ड के साथ बनाते हैं , डबल और शून्य पॉइंटर, और आपके द्वारा पारित तुलनात्मक कार्य को पता है कि किस प्रकार की आवश्यकता है और संघ के उचित सदस्य तक पहुंचता है। मैं वास्तव में नहीं देखता कि यह भाषा का एक मानक हिस्सा क्यों नहीं है, क्योंकि यूनियन को के एंड आर में परिभाषित किया गया है, इसलिए प्रत्येक सदस्य को सबसे कम पते पर गठबंधन किया जाता है, संघ को इसके सभी सदस्यों के लिए उचित स्मृति संरेखण की गारंटी है, और हो सबसे व्यापक पकड़ने के लिए काफी व्यापक है। –

उत्तर

5

GNU C language extensions एक संघ को कास्टिंग सी मानक के विस्तार के रूप में चिह्नित किया गया है। तो शायद आपको इसे सी 99 या किसी अन्य सी मानक में नहीं मिलेगा। आईबीएम सी कंपाइलर भी इस एक्सटेंशन का समर्थन करता है।

5
[[email protected] NeilB]$ gcc -Wall -pedantic sw.c 
sw.c: In function 'main': 
sw.c:11: warning: ISO C forbids casts to union type 
sw.c:12: warning: ISO C forbids casts to union type 
संबंधित मुद्दे