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のに、なぜそれをクラス宣言で使用するのですか?

4

2 に答える 2

3

クラスまたは関数の定義では、開発者が追加の特性を追加する必要がある場合、各クラスまたは関数の定義でハードコーディングするのではなく、MACROS を使用します。これは、プログラミングの良い習慣です。ある日、この特性を変更する必要がある場合、コードのどこでも変更するのではなく、1 か所だけを変更する必要があるためです。

クラス定義でのマクロの使用

#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;
}

それでは、あなたの問題は何ですか?上記のように定義された任意の有用な特性にすることができます。ここに私がgitから得た一例があります

#define SCOPED_LOCKABLE     __attribute__ ((scoped_lockable)) 
于 2013-05-29T08:30:50.907 に答える