typedef
typedef क्या है?
C में कुछ type नाम लंबे और दोहराव वाले होते हैं — unsigned long int, struct Employee, या कोई उलझा function-pointer type। typedef आपको किसी भी मौजूदा type को एक छोटा, पढ़ने योग्य alias देने देता है, ताकि आप हर जगह छोटा नाम इस्तेमाल कर सकें।
ज़रूरी बात: typedef नया type नहीं बनाता। यह सिर्फ़ पहले से मौजूद type का उपनाम बनाता है। Variable बिल्कुल वैसा ही व्यवहार करता है — बस लिखने और पढ़ने में आसान हो जाता है।
एक बुनियादी alias
#include <stdio.h>
typedef unsigned int uint; // uint अब unsigned int है
int main() {
uint age = 25;
printf("Age = %u\n", age);
return 0;
}Age = 25
यहाँ uint बस unsigned int का दोस्ताना नाम है। दोनों compiler के लिए एक ही चीज़ हैं।
struct के साथ typedef
यह सबसे आम उपयोग है। आम तौर पर आप हर बार struct keyword दोहराते हैं; typedef इसे हटा देता है।
#include <stdio.h>
typedef struct {
char name[20];
int age;
} Person; // Person alias है
int main() {
Person p = {"Aman", 22};
printf("%s is %d\n", p.name, p.age);
return 0;
}Aman is 22
typedef की बदौलत आप struct Person p; के बजाय Person p; लिखते हैं — साफ़ और अन्य languages के type नामकरण के करीब। (Structures नए हैं? देखें structure बनाम union।)
Pointers और function pointers के लिए typedef
typedef तब सच में चमकता है जब type पढ़ने में कठिन हो। Function pointers इसका classic उदाहरण हैं।
#include <stdio.h>
typedef int (*Operation)(int, int); // उलझे type का alias
int add(int a, int b) { return a + b; }
int main() {
Operation op = add; // साफ़ और पढ़ने योग्य
printf("Sum = %d\n", op(5, 6));
return 0;
}Sum = 11
typedef के बिना आपको हर बार पूरा int (*op)(int, int) लिखना पड़ता। (कच्ची syntax के लिए देखें function pointers।)
typedef बनाम #define
दोनों नाम दे सकते हैं, पर एक जैसे नहीं हैं। #define अंधा text replacement है; typedef types समझता है।
| बिंदु | typedef | #define |
|---|---|---|
| किसके द्वारा | Compiler | Preprocessor |
| Types समझता है | हाँ | नहीं (सादा text) |
| Pointers के साथ सुरक्षित | हाँ | अक्सर buggy |
| Scope नियम | सामान्य scope मानता है | नीचे हर जगह text |
#define PTR int* फिर PTR a, b; सिर्फ़ a को pointer बनाता है। typedef int* PTR; के साथ a और b दोनों pointers हैं। इसीलिए types के लिए typedef सुरक्षित है।
आम गलतियाँ
- यह सोचना कि typedef नया type बनाता है — यह सिर्फ़ alias बनाता है।
- Pointer types के लिए
#defineइस्तेमाल करके अप्रत्याशित declarations पाना। - Alias नाम गलत जगह रखना (यह typedef के अंत में आता है)।
- सरल types के लिए typedef का ज़्यादा इस्तेमाल, जो छिपा सकता है कि variable असल में क्या है।
Book नाम का एक typedef struct title और price के साथ define करें, दो books बनाएँ और print करें। फिर एक declaration लंबे तरीके से (struct ...) दोबारा लिखें ताकि साबित हो कि दोनों रूप समान हैं।
सारांश
typedefकिसी मौजूदा type को छोटा, पढ़ने योग्य alias देता है — कोई नया type नहीं बनता।- Structs के साथ यह बार-बार का
structkeyword हटाता है (Person p;)। - यह pointer और function-pointer types को पढ़ने में बहुत आसान बनाता है।
- Types नाम देने के लिए
#defineपरtypedefपसंद करें — यह type-aware और सुरक्षित है।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में typedef क्या है?
typedef किसी मौजूदा type के लिए एक नया, छोटा नाम (alias) बनाता है। यह नया type नहीं बनाता — बस मौजूदा को ज़्यादा पढ़ने योग्य label देता है। जैसे typedef unsigned long ulong; से आप unsigned long की जगह ulong लिख सकते हैं।typedef और #define में क्या अंतर है?
typedef compiler द्वारा संभाला जाता है और असली types समझता है, इसलिए यह pointers और जटिल declarations के साथ भी सही चलता है। #define preprocessor का सादा text replacement है जिसमें type की समझ नहीं होती, जो अप्रत्याशित व्यवहार कर सकता है। Types नाम देने के लिए typedef ज़्यादा सुरक्षित है।C में struct के साथ typedef क्यों इस्तेमाल होता है?
struct Point p; लिखना पड़ता है। typedef struct { ... } Point; के साथ आप सिर्फ़ Point p; लिख सकते हैं। यह बार-बार का struct keyword हटाता है और code को साफ़ तथा पढ़ने में आसान बनाता है।क्या typedef नया data type बनाता है?
typedef सिर्फ़ मौजूदा type का alias बनाता है — भीतरी type अपरिवर्तित रहता है। Alias से declared variable बिल्कुल वही type होता है जो लंबे तरीके से declared, इसलिए वे पूरी तरह अदल-बदल किए जा सकते हैं।क्या typedef function pointers को पढ़ने में आसान बना सकता है?
typedef int (*Operation)(int, int); जैसा typedef आपको फिर variables को बस Operation op; के रूप में declare करने देता है, हर बार पूरी उलझी syntax दोहराए बिना।