我正在阅读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
被定义为空,那么为什么要在类声明中使用呢?
答案 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))
答案 1 :(得分:1)
它可能被定义为在不同环境中的不同之处。有时它会影响联系。
它还可以指示需要包含其他标头以使库标头正确配置。