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 而不是在每个类或函数定义中进行硬编码。这是编程的好习惯。因为有一天如果你需要改变这个特性,你只需要在一个地方而不是代码的任何地方都需要改变。

类定义中宏的一些用法

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

class CONTROLLER_API CConfiguration{
} ;

您可以在此处获得更多与 windows 相关的有用线索。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)) 
  • 有关__attribute__检查的详细信息,请单击此处
  • 对于我上面代码检查的源代码here
于 2013-05-29T08:30:50.907 回答
1

它可能被定义为不同环境中的不同事物。有时它会影响链接。

它还可以指示需要包含其他头文件才能正确配置库头文件。

于 2013-05-29T08:13:10.330 回答