@lniwn
2017-07-12T12:25:47.000000Z
字数 685
阅读 608
C++
对于RAII形式的宏定义,在同一个作用域定义多次,会出现命名冲突,看下面代码:
struct TLock
{
void Lock();
void Unlock();
}
g_Lock1, g_Lock2;
struct TLockUse
{
TLockUse( TLock &lock ):m_Lock(lock){ m_Lock.Lock(); }
~TLockUse(){ m_Lock.Unlock(); }
TLock &m_Lock;
};
void DoSomething()
{
TLockUse lock_use1( g_Lock1 );
TLockUse lock_use2( g_Lock2 );
// ...
}
为了简便起见,我们一般会定义下面这样的宏,用来同步代码块
#define SCOPE_LOCK(l) TLockUse __lock_name(l)
下面是使用的代码
void DoSomething()
{
SCOPE_LOCK(g_Lock1);
SCOPE_LOCK(g_Lock2);
// ...
}
看起来很正常的用法,但不幸的是,编译的时候会报__lock_name
重定义,至于原因,大家应该一眼就能看明白,但是解决方法,却不是那么完美,这时,我们就要借助一个宏__COUNTER__
。
#define CONCAT_IMPL( x, y ) x##y
#define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )
#define SCOPE_LOCK(l) TLockUse MACRO_CONCAT(ThreadSafe, __COUNTER__)(l)
__COUNTER__
的解释,可以参考MDSN文档