2013-06-29 6 views
6

सामान्य रूप से, क्या #define या constant char */ int द्वारा कुछ विशिष्ट पैरामीटर (उदा। (char *) UserIPaddr="192.168.0.5", (int) MAX_BUF=1024) को परिभाषित करना बेहतर है?#define या निरंतर char/int का उपयोग कब करें?

मैंने कुछ सूत्रों को पढ़ा है कि यह संभव है कि #define का उपयोग न करें जब यह संभव हो। हालांकि, मैं एक स्रोत कोड से खुला स्रोत कोड one example पर #define की काफी आम उपयोग देखें:

#define IEEE80211_WLAN_HDR_LEN  24 
    a_uint8_t *iv = NULL; 
    a_uint16_t tmp; 
    a_uint16_t offset = IEEE80211_WLAN_HDR_LEN; 

#define वहाँ का उपयोग करने से बचा जा सकता है, लेकिन मुझे आश्चर्य है कि क्यों यह उदाहरण के लिए उस मामले पर #define उपयोग करने के लिए पसंद किया गया । मुझे #define का उपयोग कब करना चाहिए या नहीं?

उत्तर

7

सी कॉन्स घोषणाओं में निरंतर अभिव्यक्तियां उत्पन्न नहीं होती हैं, इसलिए यदि आपको निरंतर अभिव्यक्ति की आवश्यकता है तो const का उपयोग करके यह संभव नहीं है, ऐसा करने के लिए परंपरागत और अधिक सामान्य रूप से उपयोग किया जाने वाला तरीका # define का उपयोग कर रहा है।

उदाहरण const int के लिए में उपयोग नहीं किया जा सकता है:

  • एक मामले लेबल या
  • थोड़ा-क्षेत्र चौड़ाई के रूप में
  • या
  • एक गैर VLA सरणी घोषणा में सरणी आकार के रूप में
  • (पूर्व C99 दिन)
+0

'enum' के बारे में क्या? स्विच के लिए – Potatoswatter

2

अंगूठे का मेरा नियम #define का उपयोग नहीं करना है जब तक कि प्रतीक संकलन-समय स्थिर न हो। इस बात को ध्यान में रखते हुए, मैंने व्यक्तिगत रूप से आपके उदाहरण में #define का उपयोग नहीं किया होता।

the same source file से एक अलग उदाहरण लेते हैं:

#define CRYPTO_KEY_TYPE_AES   2 
... 
    switch (keytype) { 
    case CRYPTO_KEY_TYPE_AES: 

यहाँ, CRYPTO_KEY_TYPE_AES होना चाहिए एक निरंतर अभिव्यक्ति, और इस प्रकार का उपयोग कर एक निरंतर परिवर्तनशील नहीं मारूंगा।

3

#define का उपयोग करने के कुछ कारण हैं। यह बहुत कम है कि static const या enum नहीं कर सकता है।

जैसा कि आलोक सेव का उल्लेख है, static const int सी में अभिन्न निरंतर अभिव्यक्ति नहीं दे सकता है (मैं सी मानक की जांच नहीं कर रहा हूं; हालांकि यह सी ++ में मामला नहीं है)। लेकिन enum ऐसा कर सकता है। हालांकि enum शुद्ध सी में INT_MAX से बड़े मानों को समायोजित करने के लिए नहीं बढ़ता है। तो यदि आपको सरणी बाध्य या केस लेबल के रूप में उपयोग करने के लिए long मान की आवश्यकता है, तो #define आपका मित्र है। या सी ++ के सी सबसेट का उपयोग करने के लिए स्विच करने पर विचार करें, जिसमें ऐसे प्रतिबंध नहीं हैं।

+0

, एनम्स का उपयोग करना बेहतर है, इसलिए संकलक आपको चेतावनी देता है कि कुछ मामला नहीं संभाला जा रहा है। – LtWorf

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