为什么在类声明中使用宏

时间:2013-05-29 08:03:38

标签: c++ leveldb

我正在阅读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被定义为空,那么为什么要在类声明中使用呢?

2 个答案:

答案 0 :(得分: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
  • 的详细信息
  • 对于我上面的代码检查来源here

答案 1 :(得分:1)

它可能被定义为在不同环境中的不同之处。有时它会影响联系。

它还可以指示需要包含其他标头以使库标头正确配置。