2013-05-29 27 views
5

我正在閱讀leveldb的源代碼,關於互斥鎖。爲什麼在類聲明中使用宏

我發現這個聲明:

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:該代碼是從谷歌的開源項目性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; 
} 

那麼確切的問題是什麼?它可以是像上面那樣的任何有用的特徵定義。這裏是一個例子i。從GIT中

#define SCOPED_LOCKABLE  __attribute__ ((scoped_lockable)) 
  • 了有關詳細信息有關__attribute__檢查here
  • 對於我上面的代碼檢查得到了源here
相關問題