2012-10-02 8 views
7

अंदर लिनक्स कर्नेल स्रोतों मैं देख वहाँ भी है कि, अंदर enums, enum तत्व का ही नाम के साथ एक परिभाषित परिभाषित करता है। linux/rtnetlink.h में उदाहरण है:enum अंदर

enum { 
     RTM_BASE  = 16, 
#define RTM_BASE  RTM_BASE 

     RTM_NEWLINK  = 16, 
#define RTM_NEWLINK  RTM_NEWLINK 
     RTM_DELLINK, 
#define RTM_DELLINK  RTM_DELLINK 
... 

इसका कारण क्या है? मैं यह नहीं समझ सकता कि इसका उपयोग कैसे किया जाता है।

धन्यवाद

उत्तर

2

एक अन्य अनुमान: इस मैक्रो अन्य कोड को तोड़ने के बिना enum की एक प्रविष्टि का नाम बदलने की अनुमति दे सकता। बदले

enum { 
     RTM_BASE  = 16, 
#define RTM_BASE  RTM_BASE 

को
enum { 
     RTM_BASE_NEW_NEW_NEW  = 16, 
#define RTM_BASE  RTM_BASE_NEW_NEW_NEW 

एक उपयोगकर्ता अभी भी RTM_BASE इस्तेमाल कर सकते हैं।

+0

'RTM_BASE = RTM_BASE_NEW_NEW_NEW' बस के रूप में अच्छी तरह से काम करेगा, परिभाषित के बिना। –

5

एक बात मैं के बारे में सोच सकता है कि आप मैक्रो के माध्यम से बहुत अस्तित्व enum की के लिए जाँच कर सकते हैं:

#ifdef RTM_BASE 
int flag = RTMBASE; 
#else 
int flag = 0; 
#endif 

कोई विचार है कि अगर क्या हो रहा है है, हालांकि।

+0

हाँ, कि मैं वास्तव में क्या करने के बाद मैं अपने सैंडविच समाप्त लिखने के लिए जा रहा था है। यह केवल उद्देश्य मैं यह वास्तव में –

+0

उपयोगी की सेवा देख सकते हैं! लेकिन सूत्रों को देखते हुए, ऐसा लगता है कि इस तरह से परिभाषित नहीं किया जाता है। धन्यवाद। – MirkoBanchi

+1

यह कर्नेल के सूत्रों में ऐसा करने का कोई मतलब नहीं होगा, लेकिन यह उपयोगकर्ता के अंतरिक्ष अनुप्रयोग है कि एकाधिक कर्नेल संस्करणों, जहां क्षमताओं या मौजूद नहीं हो सकता है पर काम करने की आवश्यकता हो सकती है में कोई मतलब नहीं है। –

3

एक और चीज इन #define एस प्राप्त करने के अलावा पुराने कोड को पुराना नाम जारी रखने की इजाजत देने के अलावा, निरंतर नाम बदलना चाहिए, और यह जांचना कि क्या उन्हें परिभाषित किया गया है, इन प्रतीकों को परिभाषित करने के लिए अन्य कोड को रोकने के लिए है।

#include <linux/rtnetlink.h> 
// for some reason, the author thinks 
#define RTM_BASE 17.3f 
// is a good idea 

संकलित नहीं होगा।

+0

यह उत्तर मेरी राय में सही है। 2 अन्य उत्तरों मुझे बल्कि समझ में आते हैं। इस में वास्तविक, कठिन खोजने, नाम झड़पों को उजागर करने की क्षमता है, जो बनाना काफी आसान है। –