2010-04-07 11 views
11

सी कोड में #define के स्थान पर typedef का उपयोग करने के लिए क्या लाभ (यदि कोई है) है?#defines के बजाय सी टाइपपीफ का उपयोग क्यों करें?

एक उदाहरण के रूप में, वहाँ जब दोनों के रूप में

void func() 
{ 
     UBYTE byte_value = 0; 

     /* Do some stuff */ 

     return byte_value; 
} 

इस्तेमाल किया जा सकता जाहिर है पूर्व प्रोसेसर की कोशिश करेंगे

typedef unsigned char UBYTE 

का उपयोग कर

#define UBYTE unsigned char 

से अधिक करने के लिए किसी भी लाभ है #define का विस्तार करें जहां भी यह एक देखता है, जोके साथ नहीं होगा, लेकिन ऐसा लगता है कि मुझे कोई विशेष लाभ या हानि नहीं है; मैं ऐसी परिस्थिति के बारे में नहीं सोच सकता जहां कोई समस्या होने पर या तो उपयोग में कोई त्रुटि नहीं होगी।

उत्तर

23

आप एक सरणी प्रकार का एक typedef करते हैं, तो आप अंतर देखेंगे:

typedef unsigned char UCARY[3]; 
struct example { UCARY x, y, z; }; 

करने से उस एक #define साथ ... कोई, चलो वहाँ नहीं जाना।

[संपादित करें]: एक अन्य लाभ यह है कि एक डिबगर्स आमतौर पर टाइपिफ के बारे में जानते हैं लेकिन # परिभाषा नहीं जानते हैं।

+9

प्रीप्रोसेसर को छोड़ दो: "मुझे दुर्व्यवहार करें, मुझे दुर्व्यवहार करें .. मुझे वांछित महसूस करें !!" +1 –

+0

मैं प्रीप्रोसेसर का एक उचित बिट दुरुपयोग करता हूं, लेकिन तब तक नहीं, जब तक कि कोई अन्य तरीका न हो। (मुझे पिछले 20 सालों में क्रॉस-प्लेटफ़ॉर्म 64-बिट पूर्णांक हैंडलिंग करने के लिए कोड लिखने के बाद * एक बार * इसकी आवश्यकता थी। उस समय उपलब्ध कंपेलरों पर यह आश्चर्यजनक रूप से मुश्किल था, और मेरे पास अधिक से अधिक #ifdefs के साथ समाप्त हुआ पसंदीदा।) –

+0

पॉइंटर प्रकारों को भी काम करता है ... – hugomg

2

#define के साथ आपको प्रीप्रोकैसिंग के दौरान स्ट्रिंग प्रतिस्थापन मिलता है। typedef एक नया प्रकार पेश करता है। यह आपके कोड में संभावित समस्याओं को ढूंढना आसान बनाता है और किसी भी मामले में संकलक आपको अधिक विस्तृत जानकारी देने में सक्षम हो सकता है।

+1

काफी * नया * प्रकार नहीं - यह मौजूदा प्रकार के लिए उपनाम है - लेकिन यह एक प्रकार है, हां – philsquared

3

ठीक है, एक C++ से आ रहा है, परिप्रेक्ष्य, एक सी ++ अपने कोड का उपयोग प्रोग्रामर की तरह कुछ हो सकता है:

 
template<typename T> class String 
{ 
    typedef T char_type; 
    // ... 
}; 
अब

, यदि आपका सी कोड में, आपके द्वारा लिखी गई कुछ की तरह:

 
#define char_type uint32_t // because I'm using UTF-32 

ठीक है, आप अपने हेडर फ़ाइल के उपयोगकर्ताओं के लिए गंभीर परेशानी पैदा करने जा रहे हैं। टाइपपीफ के साथ, आप टाइपपेफ के मान को अलग-अलग क्षेत्रों में बदल सकते हैं ... जबकि स्कॉप्स को # डिफाइन के साथ सम्मान नहीं किया जाता है।

मुझे पता है कि आपने इस सी को लेबल किया है, लेकिन सी प्रोग्रामर और सी ++ प्रोग्रामर को यह एहसास होना चाहिए कि उनके शीर्षकों का एक-दूसरे द्वारा उपयोग किया जा सकता है ... और यह उन चीजों में से एक है जो ध्यान में रखना है।

2

1) शायद बड़ा लाभ एक क्लीनर कोड है। आमतौर पर मैक्रोज़ का दुरुपयोग कोड को एक अनजान गड़बड़ में बदल देता है, जिसे 'मैक्रो सूप' कहा जाता है।

2) टाइपिफ़ का उपयोग करके आप एक नया प्रकार परिभाषित करते हैं। एक मैक्रो का उपयोग करके आप वास्तव में पाठ को प्रतिस्थापित करते हैं। टाइपिफ़ त्रुटियों से निपटने के दौरान संकलक निश्चित रूप से अधिक सहायक होता है।

2
  • डिबगर और कंपाइलर त्रुटि संदेश अधिक उपयोगी हो जाते हैं यदि कंपाइलर/डीबगर इस प्रकार के बारे में जानता है। (यही कारण है कि आपको स्थिरांक का उपयोग करना चाहिए और जहां संभव हो परिभाषित नहीं करना चाहिए)
  • Arrays, जैसा कि अन्य ने
  • दिखाया है, आप टाइपपीफ को एक छोटे दायरे (कहें, एक फ़ंक्शन) तक सीमित कर सकते हैं। सी ++ में और भी सच है।
संबंधित मुद्दे