2013-05-29 4 views
5

में मैक्रो का उपयोग क्यों करें मैं leveldb, esp का स्रोत कोड पढ़ रहा हूं। म्यूटॉक्सॉक के बारे में।कक्षा घोषणा

मैं इस घोषणा पाया:

class SCOPED_LOCKABLE MutexLock { 
public: 
    explicit MutexLock(port::Mutex *mu) EXCLUSIVE_LOCK_FUNCTION(mu) 
     : mu_(mu) { 
    this->mu_->Lock(); 
    } 
    ~MutexLock() UNLOCK_FUNCTION() { this->mu_->Unlock(); } 

private: 
    port::Mutex *const mu_; 
    // No copying allowed 
    MutexLock(const MutexLock&); 
    void operator=(const MutexLock&); 
}; 

और मैंने पाया कि SCOPED_LOCKABLE खाली के रूप में परिभाषित किया गया है, तो क्यों वर्ग घोषणा में इसका इस्तेमाल करते हैं?

+1

मुझे लगता है कि कुछ विन्यास के साथ, मैक्रो अंत कुछ को परिभाषित किया जा रहा है (देखें http://gperftools.googlecode.com/svn-history/r99/trunk/src/base/thread_annotations.h) –

+0

FYI: कोड Google के ओपन सोर्स प्रोजेक्ट leveldb से है: https: // github.com/google/leveldb/blob/77948e 7eec0613fb5cbecb7e320b9498607030b5/util/mutexlock.h –

उत्तर

1

इसे किसी भिन्न वातावरण में कुछ अलग के रूप में परिभाषित किया जा सकता है। कभी-कभी यह लिंक को प्रभावित कर सकता है।

यह यह भी संकेत दे सकता है कि लाइब्रेरी हेडर को सही तरीके से कॉन्फ़िगर करने के लिए अन्य शीर्षकों को शामिल करने की आवश्यकता है।

2

कक्षा या फ़ंक्शन परिभाषाओं में यदि डेवलपर को अतिरिक्त विशेषता संलग्न करने की आवश्यकता है तो यह प्रत्येक वर्ग या फ़ंक्शन परिभाषाओं में हार्ड कोडिंग की तुलना में मैक्रो का उपयोग करता है। यह प्रोग्रामिंग के लिए एक अच्छा अभ्यास है। क्योंकि एक दिन यदि आपको इस विशेषता को बदलने की ज़रूरत है तो आपको कोड के हर जगह न केवल एक ही जगह में बदलना होगा।

वर्ग परिभाषा में मैक्रोज़ के कुछ उपयोग

#ifdef CONTROLLER_EXPORTS 
    #define CONTROLLER_API __declspec(dllexport) 
#else 
    #define CONTROLLER_API __declspec(dllimport) 
#endif 

class CONTROLLER_API CConfiguration{ 
} ; 

आप उपयोगी सुराग यहाँ संबंधित कुछ और खिड़कियों मिल सकती है। http://msdn.microsoft.com/en-us/library/dabb5z75(v=vs.80).aspx

यहां तक ​​कि आप इस तरह के एक्सेस संशोधक का उपयोग भी कर सकते हैं, क्योंकि परीक्षण के लिए कुछ समय आपको पहुंच स्तर को अस्थायी रूप से बदलने की आवश्यकता हो सकती है।

#define PRIVATE private 
#define PUBLIC public 

class A{ 
PRIVATE: 
    int m_a; 
PUBLIC: 
    int m_b; 
} 

फिर आपकी समस्या क्या है? यह ऊपर की तरह किसी भी उपयोगी विशेषता परिभाषित किया जा सकता है। यहाँ एक उदाहरण मैं के बारे में __attribute__ जांच here

  • Git

    #define SCOPED_LOCKABLE  __attribute__ ((scoped_lockable)) 
    
    • से मिला स्रोत मैं कोड की जांच से ऊपर हो गया के लिए जानकारी के लिए है here
  • संबंधित मुद्दे