2015-09-18 11 views
5

मैं वर्तमान में सी में struct डेटा संरचना के बारे में सीख रहा हूं और इस संरचना को typedef कीवर्ड के साथ कैसे पेश करना संभव है। यह वास्तविक संरचना के चर नाम अलग नामस्थान में रखा जा रहा के रूप में कई अलग अलग संदर्भों में विस्तार से बताया कारण बनता है:टाइप किए गए टाइप किए गए कीवर्ड

Difference between 'struct' and 'typedef struct' in C++?

typedef struct vs struct definitions

हालांकि, यह स्पष्ट नहीं है के रूप में क्या उदाहरण के साथ हो रहा है कि मैं के साथ काम कर रहा हूँ:

#include <stdio.h> 

struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} synth; 

int main() 
{  
    printf("Size of struct: %i\n", sizeof(struct demo)); 
    printf("Size of struct: %i\n", sizeof(synth)); 
    return 0; 
} 

इस उदाहरण में, मैं synth चर के माध्यम से struct डेटा संरचना का उपयोग करने में सक्षम हूँ नाम; हालांकि, मैंने जो उदाहरण देखा है, उनमें से struct को typedef के साथ प्रीफ़ेस करने की आवश्यकता है। इस उदाहरण में, typedef का उपयोग नहीं किया गया है और फिर भी मैं इस संरचना को synth के माध्यम से संदर्भित करने में सक्षम हूं। मैं सोच रहा हूं कि वास्तव में क्या हो रहा है कि सी मुझे ऐसा करने की इजाजत दे रहा है? किसी भी स्पष्टीकरण की सराहना की जाएगी। चीयर्स।

// declare struct demo 
struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
}; 

// define struct variable synth 
struct demo synth; 

अब आप struct सदस्यों, उदाहरण के उपयोग कर सकते हैं:

+0

आप परिचित हैं:

Books Book1, Book2; 

आप इस प्रकार के रूप में अच्छी गैर structs के लिए typedef कीवर्ड का उपयोग कर सकते हैं: निम्न उदाहरण है 'typedef' क्या करता है? – ameyCU

+0

'sizeof' प्रकार' size_t' का परिणाम उत्पन्न करता है। 'Size_t' मान के लिए सही प्रारूप स्ट्रिंग'% zu' है, न कि '% i' (जो' int' के लिए है)। –

+0

'size_t' जानकारी के लिए धन्यवाद। जो मैं समझता हूं, उससे 'टाइपिफ़' क्या होता है यह एक अलग नामस्थान में एक चर बनाता है जो संरचना को 'संरचना डेमो' का उपयोग किए बिना संदर्भित करने की अनुमति देता है। सुनिश्चित नहीं है कि दृश्यों के पीछे कुछ और हो रहा है या नहीं। –

उत्तर

6
struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} synth; 

के रूप में ही है

synth.sequential = 1; 

sizeof(struct demo)struct demo के आकार देता है।

sizeof(synth) ठोस उदाहरण synth का आकार देता है।

इस मामले में दोनों एक ही आकार को वापस कर देते हैं।

अद्यतन: Linux kernel coding style से

:

typedef का उपयोग करते हुए यह ऐसा दिखाई दे सकता:

// declare new type demo 
typedef struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} demo_t; 

// define demo_t variable synth 
demo_t synth; 

अद्यतन 2

अध्याय 5: टाइपपीफ

कृपया "vps_t" जैसी चीज़ों का उपयोग न करें। संरचनाओं और पॉइंटर्स के लिए टाइपपीफ का उपयोग करने के लिए यह गलती है। जब आप

vps_t a; 

स्रोत में, इसका क्या अर्थ है? इसके विपरीत, यदि यह कहते हैं

struct virtual_container *a; 

आप वास्तव में बता सकते हैं क्या "एक" है।

0

यह के रूप में यदि आप घोषित एक ही है:

int i; 

और यह आपने क्या किया:

printf("Size of int: %i\n", sizeof(int)); 
printf("Size of int: %i\n", sizeof(i)); 

दो पंक्तियों में एक ही मूल्य प्रिंट होगा।

, तो आप इस था:

typedef struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} mydemo; 

mydemo synth; 

आप ऐसा कर सकता है:

printf("Size of struct: %i\n", sizeof(struct demo)); 
printf("Size of struct: %i\n", sizeof(mydemo)); 
printf("Size of struct: %i\n", sizeof(synth)); 

और वे भी एक ही बात मुद्रित होगा।

0

मैं synth परिवर्तनीय नाम के माध्यम से struct data structure तक पहुंचने में सक्षम हूं; हालांकि, मैंने जो उदाहरण देखा है, उनमें से struct को typedef के साथ प्रीफ़ेस करने की आवश्यकता है।

नहीं, यह आपको नहीं लगता है। यह typedef की वजह से नहीं है, आप synth के साथ संरचना सदस्यों तक पहुंच सकते हैं।

इस उदाहरण में, typedef इस्तेमाल नहीं किया है और अभी तक मैं अभी भी synth के माध्यम से इस संरचना को संदर्भित करने में सक्षम हूँ।

यह synth के कारण है क्योंकि यह struct variable है कि आप संरचना के सदस्यों तक पहुंच सकते हैं।

typedef एक भाषा है जो मौजूदा भाषाओं में वैकल्पिक नाम असाइन करने के लिए सी भाषा में उपयोग की जाती है। उपयोगकर्ता द्वारा परिभाषित डेटा प्रकारों के लिए।

एक उदाहरण -

typedef struct A{ 
    char B; 
    int C; 
}D ; 

यहाँ अब, D struct चर घोषित करने के लिए इस्तेमाल किया जा सकता।

typedef बिना -

struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
}synth; 

synth एक struct चर रहा है और आप struct के सदस्यों तक पहुँच सकते हैं। typedef में कोई भूमिका नहीं है

struct demo t; 

मामले से किसी दशा में अगर आप भी synth साथ typedef को दूर तो भी आप उपयोग कर सकते हैं struct, - लेकिन typedef के बिना इस में यदि आप struct चर घोषित करने के लिए चाहते हैं तो आप इस तरह की घोषणा करने के लिए है उस।

2

typedef कीवर्ड सी struct प्रकारों के लिए अनावश्यक है। यह आपको एकमात्र लाभ देता है कि यह इस प्रकार के लिए एक शब्द का नाम बनाता है।

अपने उदाहरण में घोषणा:

struct demo 
{ 
    /* ... */ 
} synth; 

वास्तव में दो घोषणाओं, प्रकार struct demo के लिए, और उस प्रकार synth नामित के ऑब्जेक्ट के लिए एक है। यह शायद दो अलग-अलग घोषणाओं के रूप में अधिक स्पष्ट रूप से लिखा गया है:

struct demo 
{ 
    /* ... */ 
}; 

struct demo synth; 

पहली घोषणा एक नया संरचना प्रकार बनाती है। इसका नाम struct demo है। दूसरा उस प्रकार की वस्तु को परिभाषित करता है, जिसका नाम synth है।

पहचानकर्ता demo इन घोषणाओं को देखते हुए, अर्थहीन है; यह संरचना टैग है, और यह केवल struct कीवर्ड से पहले अर्थपूर्ण है।

synth दूसरी ओर, ऑब्जेक्ट (चर) का नाम है। इसे struct कीवर्ड से पहले, और वास्तव में नहीं किया जा सकता है।

यदि आप चाहें तो typedef टाइप करें ताकि struct demo दूसरा नाम दिया जा सके।

typedef struct demo { 
    /* ... */ 
} demo; 
अपने मूल घोषणा की तरह

, यह वास्तव में दो है: उदाहरण के लिए, एक आम मुहावरा है, (एक मौजूदा प्रकार के लिए एक उपनाम यह महज एक नया नाम को परिभाषित करता है,, एक typedef एक नए प्रकार को परिभाषित नहीं करता है।) घोषणाएं, struct परिभाषा जो struct demo टाइप करती है, और typedef बनाता है जो उस प्रकार के लिए demo का नया नाम बनाता है। यदि आप चाहें,

struct demo { 
    /* ... */ 
}; 
typedef struct demo demo; 

पीछा किया, एक वस्तु घोषणा द्वारा:: यह रूप में लिखा जा सकता है

demo synth; 

(नोट struct टैग और typedef नाम अलग होने के लिए कोई आवश्यकता नहीं है कि, और आईएमएचओ उनके लिए यह स्पष्ट है।)

संरचना प्रकारों के लिए typedef का उपयोग करने का विकल्प ज्यादातर शैली में से एक है। संरचनाओं के लिए typedef का उपयोग करने के लिए मेरी निजी वरीयता नहीं है; struct demo पहले से ही एक अच्छा नाम है। लेकिन बहुत सारे प्रोग्रामर एक ऐसा नाम पसंद करते हैं जो एक पहचानकर्ता है।

+0

@ जेन्सगस्टेड: फिक्स्ड, धन्यवाद! –

0

टाइपपीफ कीवर्ड: structs को परिभाषित करने का एक आसान तरीका है या आप "उपनाम" प्रकार बना सकते हैं। उदाहरण के लिए:

typedef struct 
{ 
    char title[50]; 
    char author[50]; 
    char subject[100]; 
    int book_id; 
}Books; 

अब, आप पुस्तक कीवर्ड का उपयोग किए बिना पुस्तक प्रकार के चर को परिभाषित करने के लिए सीधे पुस्तकें का उपयोग कर सकते हैं।

typedef long int *pint32; 

pint32 x, y, z; 

एक्स, वाई और जेड लंबे ints करने के लिए सभी संकेत दिए गए हैं

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