जवाबों:
नहीं।
#define
एक प्रीप्रोसेसर टोकन है: संकलक स्वयं इसे कभी नहीं देखेगा।
typedef
एक संकलक टोकन है: प्रीप्रोसेसर को इसकी परवाह नहीं है।
आप एक ही प्रभाव प्राप्त करने के लिए एक या दूसरे का उपयोग कर सकते हैं, लेकिन अपनी आवश्यकताओं के लिए उचित एक का उपयोग करना बेहतर है
#define MY_TYPE int
typedef int My_Type;
जब चीजें "बालों वाली" हो जाती हैं, तो उचित उपकरण का उपयोग करना सही बनाता है
#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);
void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */
void fx_def(void (*)(int) fx);
; सही घोषणा है void fx_def(void (*fx)(int));
।
#define FX_TYPE(f) void (*f)(int)
:। तब आप अपने कार्य को इस प्रकार घोषित करेंगे:void fx_def(FX_TYPE(fx));
typedef
चर जैसे नियमों का पालन करना, जबकि define
संकलन इकाई के अंत तक (या एक मिलान तक undef
) मान्य रहता है ।
साथ ही, कुछ चीजें ऐसी भी की जा सकती हैं, जिनके साथ typedef
नहीं किया जा सकता है define
।
उदाहरण के लिए:
typedef int* int_p1;
int_p1 a, b, c; // a, b, c are all int pointers
#define int_p2 int*
int_p2 a, b, c; // only the first is a pointer, because int_p2
// is replaced with int*, producing: int* a, b, c
// which should be read as: int *a, b, c
typedef int a10[10];
a10 a, b, c; // create three 10-int arrays
typedef int (*func_p) (int);
func_p fp; // func_p is a pointer to a function that
// takes an int and returns an int
नहीं, वे एक समान नहीं हैं। उदाहरण के लिए:
#define INTPTR int*
...
INTPTR a, b;
प्रीप्रोसेसिंग के बाद, वह रेखा फैल जाती है
int* a, b;
उम्मीद है कि आप समस्या देखते हैं; केवल a
प्रकार होगा int *
; b
एक सादा घोषित किया जाएगा int
(क्योंकि *
घोषणाकर्ता के साथ जुड़ा हुआ है, न कि प्रकार निर्दिष्टकर्ता)।
इसके विपरीत
typedef int *INTPTR;
...
INTPTR a, b;
इस मामले में, दोनों a
और b
टाइप होंगे int *
।
टंकण की पूरी कक्षाएं हैं जो एक प्रीप्रोसेसर मैक्रो के साथ उत्सर्जित नहीं की जा सकती हैं, जैसे कि फ़ंक्शन या गिरफ्तार करने के लिए संकेत:
typedef int (*CALLBACK)(void);
typedef int *(*(*OBNOXIOUSFUNC)(void))[20];
...
CALLBACK aCallbackFunc; // aCallbackFunc is a pointer to a function
// returning int
OBNOXIOUSFUNC anObnoxiousFunc; // anObnoxiousFunc is a pointer to a function
// returning a pointer to a 20-element array
// of pointers to int
प्रीप्रोसेसर मैक्रो के साथ ऐसा करने का प्रयास करें।
#define मैक्रोज़ को परिभाषित करता है।
टाइपेडिफ प्रकारों को परिभाषित करता है।
अब कह रहे हैं कि, यहाँ कुछ अंतर हैं:
#Define के साथ आप उन कंटेस्टेंट्स को परिभाषित कर सकते हैं जिनका उपयोग संकलन समय में किया जा सकता है। स्थिरांक के साथ इस्तेमाल किया जा सकता #ifdef जाँच कैसे कोड संकलित किया गया है, और संकलन मानकों के अनुसार कुछ कोड विशेषज्ञ।
आप लघु खोज और मैक्रो कार्यों को बदलने के लिए #define का उपयोग कर सकते हैं ।
टाइपीडिफ का उपयोग उपनामों को देने के लिए किया जा सकता है (जो आप शायद #define के साथ भी कर सकते हैं), लेकिन यह #define स्थिरांक की प्रकृति को खोजने और बदलने के कारण सुरक्षित है।
इसके अलावा, आप टाइपडिफ़ के साथ आगे की घोषणा का उपयोग कर सकते हैं जो आपको एक प्रकार की घोषणा करने की अनुमति देता है जिसका उपयोग किया जाएगा, लेकिन अभी तक उस फ़ाइल से जुड़ा नहीं है जिसे आप लिख रहे हैं।
प्रीप्रोसेसर मैक्रोज़ (" #define
एस") एक लेक्सिकल रिप्लेसमेंट टूल हैं "ला एंड रिप्लेस"। वे प्रोग्रामिंग भाषा के पूरी तरह से अज्ञेय हैं और आपको जो कुछ भी करने की कोशिश कर रहे हैं उसकी कोई समझ नहीं है। आप उन्हें महिमामंडित कॉपी / पेस्ट मैकेनिक के रूप में सोच सकते हैं - कभी-कभी यह उपयोगी होता है, लेकिन आपको इसका उपयोग सावधानी से करना चाहिए।
टाइपेडिफ्स एक सी भाषा सुविधा है जो आपको प्रकारों के लिए उपनाम बनाने की सुविधा देती है। यह जटिल यौगिक प्रकार (जैसे संरचना और फंक्शन पॉइंटर्स) को पठनीय और सुपाच्य बनाने के लिए अत्यंत उपयोगी है (C ++ में ऐसी स्थितियाँ भी हैं जहाँ आपको एक प्रकार लिखना आवश्यक है )।
के लिए (3): आप हमेशा जब संभव हो तो प्रीप्रोसेसर मैक्रोज़ पर भाषा सुविधाओं को प्राथमिकता देना चाहिए! इसलिए हमेशा टाइप्स के लिए टाइपीडिफ का उपयोग करें, और स्थिरांक के लिए निरंतर मान। इस तरह, संकलक वास्तव में आपके साथ सार्थक बातचीत कर सकता है। याद रखें कि संकलक आपका मित्र है, इसलिए आपको इसे यथासंभव बताना चाहिए। प्रीप्रोसेसर मैक्रोज़ कंपाइलर से आपके शब्दार्थ को छिपाकर सटीक विपरीत करते हैं।
वे बहुत अलग हैं, हालांकि उनका उपयोग अक्सर कस्टम डेटा प्रकारों को लागू करने के लिए किया जाता है (जो कि मैं इस सवाल को मान रहा हूं)।
जैसा कि पीएमजी ने उल्लेख किया है, #define
कंपाइलर कोड को देखने से पहले प्री-प्रोसेसर (जैसे कट-एंड-पेस्ट ऑपरेशन) द्वारा संभाला जाता है और कंपाइलर typedef
द्वारा व्याख्या की जाती है।
मुख्य अंतरों में से एक (कम से कम जब यह डेटा प्रकारों को परिभाषित करने की बात आती है) यह है कि typedef
अधिक विशिष्ट प्रकार की जाँच के लिए अनुमति देता है। उदाहरण के लिए,
#define defType int
typedef int tdType
defType x;
tdType y;
यहां, कंपाइलर वेरिएबल x को एक इंट के रूप में देखता है, लेकिन वेरिएबल y को 'tdType' नामक डेटा टाइप के रूप में होता है जो इंट के समान आकार का होता है। यदि आपने एक फ़ंक्शन लिखा है, जो टाइप डिफेक्ट का एक पैरामीटर लेता है, तो कॉल करने वाला एक सामान्य इंट पास कर सकता है और कंपाइलर को अंतर नहीं पता होगा। यदि इसके बजाय फ़ंक्शन ने tdType का एक पैरामीटर लिया, तो कंपाइलर यह सुनिश्चित करेगा कि फ़ंक्शन कॉल के दौरान उचित प्रकार के एक चर का उपयोग किया गया था।
इसके अलावा, कुछ डीबगर्स के पास typedef
एस को संभालने की क्षमता होती है , जो कि सभी कस्टम प्रकारों को उनके अंतर्निहित आदिम प्रकारों के रूप में सूचीबद्ध करने की तुलना में अधिक उपयोगी हो सकता है (जैसा कि #define
इसके बजाय इसका उपयोग किया गया था)।
नहीं
टाइपसीफ एक सी कीवर्ड है जो एक प्रकार के लिए एक उपनाम बनाता है।
#define एक पूर्व-प्रोसेसर निर्देश है, जो संकलन से पहले एक पाठ प्रतिस्थापन घटना बनाता है। जब संकलक कोड में जाता है, तो मूल "# परिभाषित" शब्द अब नहीं है। # डिफाइन का उपयोग ज्यादातर मैक्रोज़ और वैश्विक स्थिरांक के लिए किया जाता है।
AFAIK, नहीं।
typedef
मौजूदा डेटा प्रकार के लिए "उपनाम" सेट करने में आपकी सहायता करता है। उदाहरण के लिए। typedef char chr
;
#define
मैक्रो या सामान्य पैटर्न प्रतिस्थापन को परिभाषित करने के लिए एक प्रीप्रोसेसर निर्देश का उपयोग किया जाता है। उदाहरण के लिए। #define MAX 100
, सभी घटनाओं को MAX
100 में बदल देता है
जैसा कि ऊपर उल्लेख किया गया है, #define
टाइपपैड के बीच एक महत्वपूर्ण अंतर है । इसके बारे में सोचने का सही तरीका यह है कि एक टाइप्डेफ को पूर्ण "एन्कैप्सुलेटेड" प्रकार के रूप में देखा जाए। इसका मतलब है कि आप इसे घोषित करने के बाद इसे जोड़ नहीं सकते।
आप अन्य प्रकार के विनिर्देशक के साथ एक मैक्रो टाइपनेम का विस्तार कर सकते हैं, लेकिन एक टाइप किए गए टाइफनाम का नाम नहीं:
#define fruit int
unsigned fruit i; // works fine
typedef int fruit;
unsigned fruit i; // illegal
इसके अलावा, एक टाइप-डी नाम एक घोषणा में हर घोषणाकर्ता के लिए प्रकार प्रदान करता है।
#define fruit int *
fruit apple, banana;
मैक्रो विस्तार के बाद, दूसरी पंक्ति बन जाती है:
int *apple, banana;
Apple एक इंट का सूचक है, जबकि केला एक int है। तुलना में। इस प्रकार एक टाइफाइड:
typedef char *fruit;
fruit apple, banana;
सेब और केला दोनों को समान घोषित करता है। मोर्चे पर नाम अलग है, लेकिन वे दोनों एक चार के संकेत हैं।
जैसा कि सभी ने कहा, वे समान नहीं हैं। अधिकांश उत्तर इससे typedef
अधिक लाभकारी होने का संकेत देते हैं #define
। लेकिन मुझे एक प्लस पॉइंट देना चाहिए #define
:
जब आपका कोड बहुत बड़ा है, कई फाइलों में बिखरा हुआ है, तो इसका उपयोग करना बेहतर है #define
; यह पठनीयता में मदद करता है - आप इसकी घोषणा के स्थान पर एक चर की वास्तविक प्रकार की परिभाषा को देखने के लिए सभी कोड को प्रीप्रोसेस कर सकते हैं।
stdfx
, उस प्रकार की वैध वस्तुएं उन कार्यों की ओर संकेत करती हैं जो एक इंट प्राप्त करते हैं और एक मान नहीं लौटाते हैं।