@lniwn
2017-07-12T04:25:47.000000Z
字数 685
阅读 758
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文档
