2010-08-29 19 views
5

में स्पष्ट रूप से कोई उदाहरण परिभाषित नहीं करती है, मैं शेर की पुस्तक के साथ यूनिक्स संस्करण 6 के कोड के माध्यम से जा रहा हूं। हेडर फाइल (param.h, here पहुँचा जा सकता है) में से एक को परिभाषित करता है निम्नलिखित structs:संरचना जो यूनिक्स v6

/*struct to access integers*/ 

/*single integer */ 
struct { int integ; }; 

/*in bytes*/ 
struct { char lobyte; char hibyte; }; 

इन संरचनाओं किसी भी घटना को परिभाषित नहीं हैं, न ही वे ऐसा नाम वे बाद में इस्तेमाल किया जा सकता है। क्या किसी को पता है कि उनका उपयोग क्या है?

धन्यवाद

+0

आप पूर्ण स्रोत कोड है? क्या आप यह देखने के लिए grep कर सकते हैं कि उन चीजों का कभी भी उपयोग किया जाता है? (शायद grep के लिए थोड़ा मुश्किल हो सकता है, लेकिन आप उस हेडर को शामिल करने वाली फ़ाइलों को खोजने का प्रयास कर सकते हैं और फिर "lobyte" या कुछ कहलाते हैं ...) –

उत्तर

5

यदि किसी व्यक्ति ने संघ घोषणा में पूरे फ़ाइल शामिल, यह उन्हें अलग-अलग हिस्सों तक पहुंच सकते हैं। कुछ

यह होगा की तरह:


    union{ 
    #include <param.h> 
    } myparam; 

    myparam.integ = 0xDEAD; 
    assert(myparam.lobyte == 0xAD) 
    assert(myparam.hibyte == 0xDE) 

(वास्तुकला का endianness पर निर्भर करता है ...)

तो थोड़ा चारों ओर देखा है, ऐसा लगता है कि सी के पुराने संस्करणों में, आप wouldn ' संघ की घोषणा करने की जरूरत नहीं है; सभी संरचना/संघ के सदस्यों के लिए केवल एक नामस्थान था जिसने अभी किसी बाइट ऑफसेट में अनुवाद किया था जिसे आप किसी भी चर पर उपयोग कर सकते हैं। इसका सबसे अच्छा उल्लेख मुझे मिल सकता है: http://docs.sun.com/source/806-3567/compat.html पूर्व-आईएसओ सूर्य सी का वर्णन:

सदस्य चयन ऑपरेटरों ('।', '->') का उपयोग करके संरचना, संघ और अंकगणितीय प्रकारों को सदस्यों के सदस्यों पर काम करने की अनुमति देता है अन्य संरचनाएं या संघ।

+0

क्या यह सिर्फ मुझे है या यह करने का एक बेहद शांत तरीका है यह? मुझे संदेह है कि यह वही है जिसका मतलब था। मैं वास्तव में कोड को कुछ उपयोगी बनाने के लिए एक रास्ता खोजने के लिए सराहना करता हूं। –

+0

मुझे स्वीकार करना है, मुझे यकीन नहीं है। मैंने पुराने सी कोड में कुछ भयानक संघ/संरचना/चाल शामिल किए हैं। जब आप असेंबली से आ रहे थे तो यह बहुत अजीब नहीं लग रहा था - structs और यूनियनों को अक्सर एक प्रकार की घोषणा के बजाय स्मृति लेआउट का विवरण माना जाता था। – rjw

+0

ऐसा लगता है कि यह एक संघ था लेकिन विशेष रूप से इसे घोषित किए बिना। तो उदाहरण के लिए, यदि कोई पूर्णांक है, तो आप myint.lobyte जैसी चीजें देखते हैं। param.h में कई अन्य स्थिरांक शामिल हैं जिसका अर्थ है कि एक संघ के अंदर इसे शामिल करना शायद काम नहीं करेगा।यह शायद प्राचीन सी – theprole

1

उन दिनों में, संरचनाओं के सदस्यों ने सभी समान नामस्थान साझा किए, प्रति संरचना एक नामस्थान नहीं। नतीजतन, संरचना के प्रत्येक तत्व को सभी संरचनाओं में एक अनूठा नाम होना था, या उसी तत्व को उसी संरचना के साथ उसी संरचना में दिखाना था जिसमें प्रत्येक संरचना में दिखाई दिया था। काफी कैसे है कि इन के साथ इस्तेमाल किया गया था, मुझे यकीन है कि नहीं हूँ, लेकिन मैं तुम कर सकते हो पर शक:

int x; 

x.lobyte = 1; 
x.hibyte = 2; 

या कुछ है कि के अनुरूप।

यह भी देखें:

(उन लोगों में से न तो इस सवाल का जवाब देना है, हालांकि लगता है।)

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