परिचय: शुरुआती लोग struct और typedef struct में क्यों भ्रमित होते हैं?
\n\nअगर आपने कभी Stack Overflow पर "C++ में 'struct' और 'typedef struct' में क्या अंतर है?" सवाल खोजा है, तो आपने देखा होगा कि इस टॉपिक पर हज़ारों व्यूज़ हैं। यह कोई संयोग नहीं है। कई शुरुआती C++ डेवलपर, खासकर जो C भाषा से आए हैं या पुरानी किताबें पढ़ रहे हैं, उन्हें typedef struct का अजीब सिंटैक्स दिखता है और वे सोचते हैं: जब सिर्फ struct लिख सकते हैं तो एक्स्ट्रा शब्द क्यों लिखें?
इस लेख में हम एक बार और हमेशा के लिए समझ लेंगे कि आधुनिक C++ में struct और typedef struct में क्या अंतर है। हम इस भ्रम की ऐतिहासिक जड़ों को देखेंगे, कुछ कोड उदाहरण लिखेंगे, और स्पष्ट सुझाव देंगे कि सही तरीके से कैसे लिखें। चलिए शुरू करते हैं!
C++ में struct क्या है?
\n\nबुनियादी बात से शुरू करते हैं। C++ में स्ट्रक्चर (struct) एक यूज़र-डिफ़ाइंड डेटा टाइप है जो कई वेरिएबल्स (फ़ील्ड्स) को एक नाम के तहत जोड़ता है। क्लास के विपरीत, स्ट्रक्चर के सभी सदस्य डिफ़ॉल्ट रूप से public एक्सेस मॉडिफ़ायर रखते हैं, लेकिन बाकी मामलों में C++ में struct और class लगभग समान हैं (हाँ, स्ट्रक्चर में मेथड्स, कंस्ट्रक्टर और यहां तक कि इनहेरिटेंस भी हो सकती है)।
आधुनिक C++ में स्ट्रक्चर घोषित करना इस तरह दिखता है:
\n\n// सरल स्ट्रक्चर\nstruct Point {\n int x;\n int y;\n};\n\nint main() {\n Point p1; // ठीक है: ऑब्जेक्ट बनाएं\n p1.x = 10;\n p1.y = 20;\n return 0;\n}\n\nयह बहुत सरल और सुंदर है। लेकिन फिर typedef struct कहाँ से आता है?
ऐतिहासिक पृष्ठभूमि: C भाषा की विरासत
\n\nदरअसल, C भाषा में अपने स्ट्रक्चर टाइप का वेरिएबल बनाने के लिए स्ट्रक्चर के नाम से पहले struct कीवर्ड लिखना ज़रूरी था। उदाहरण के लिए:
// C में ऐसे:\nstruct Point p1; // struct शब्द के बिना — एरर\n\nइस असुविधा से बचने के लिए, C प्रोग्रामर्स ने typedef के साथ एक ट्रिक निकाली:
// C-स्टाइल: typedef + struct\ntypedef struct {\n int x;\n int y;\n} Point;\n\nint main() {\n Point p1; // अब struct के बिना भी चलेगा\n return 0;\n}\n\nयह सिंटैक्स एक अनाम स्ट्रक्चर के लिए उपनाम (alias) बनाता है। C में यह बहुत उपयोगी था। लेकिन C++ में सब कुछ अलग तरह से काम करता है।
\n\nक्या C++ में typedef struct की ज़रूरत है?
\n\nछोटा जवाब: नहीं, ज़रूरत नहीं है। आधुनिक C++ में (C++98 स्टैंडर्ड से शुरू करके) स्ट्रक्चर का नाम अपने आप एक टाइप नाम बन जाता है। आप इसे struct कीवर्ड के बिना उपयोग कर सकते हैं।
दोनों तरीकों की तुलना करें:
\n\n// तरीका 1: शुद्ध C++ (अनुशंसित)\nstruct Point {\n int x, y;\n};\n\nPoint p1; // ठीक है\n\n// तरीका 2: पुराना C-स्टाइल (अनुशंसित नहीं)\ntypedef struct {\n int x, y;\n} Point;\n\nPoint p2; // यह भी ठीक है, लेकिन एक्स्ट्रा क्यों?\n\nदोनों विकल्प कंपाइल होंगे, लेकिन पहला छोटा, स्पष्ट और आधुनिक कोडिंग मानकों के अनुरूप है। दूसरा विकल्प सिर्फ C से आई एक आदत है।
\n\nकब typedef struct अभी भी उपयोगी हो सकता है?
\n\nकुछ स्थितियाँ जहाँ C++ में typedef struct उचित हो सकता है:
- \n
- C और C++ के लिए क्रॉस-प्लेटफ़ॉर्म कोड। अगर आप एक हेडर फ़ाइल लिख रहे हैं जो C और C++ दोनों में कंपाइल होनी चाहिए (जैसे किसी लाइब्रेरी के लिए), तो
typedef structका उपयोग करना बेहतर है — इससे कोड हर जगह काम करेगा। \n - जटिल टाइप के लिए उपनाम बनाना। कभी-कभी
typedefका उपयोग टेम्पलेट्स या स्ट्रक्चर पॉइंटर्स के साथ सिंटैक्स को सरल बनाने के लिए किया जाता है। \n - लेगसी कोड के साथ संगतता। अगर आप C-स्टाइल में लिखे किसी पुराने प्रोजेक्ट को मेंटेन कर रहे हैं, तो मौजूदा स्टाइल को न तोड़ना बेहतर है। \n
लेकिन अगर आप शुद्ध C++ में एक नया प्रोजेक्ट लिख रहे हैं, तो typedef struct को भूल जाइए।