[关闭]
@lniwn 2017-07-12T12:25:47.000000Z 字数 685 阅读 608

RAII宏命名冲突

C++


对于RAII形式的宏定义,在同一个作用域定义多次,会出现命名冲突,看下面代码:

  1. struct TLock
  2. {
  3. void Lock();
  4. void Unlock();
  5. }
  6. g_Lock1, g_Lock2;
  7. struct TLockUse
  8. {
  9. TLockUse( TLock &lock ):m_Lock(lock){ m_Lock.Lock(); }
  10. ~TLockUse(){ m_Lock.Unlock(); }
  11. TLock &m_Lock;
  12. };
  13. void DoSomething()
  14. {
  15. TLockUse lock_use1( g_Lock1 );
  16. TLockUse lock_use2( g_Lock2 );
  17. // ...
  18. }

为了简便起见,我们一般会定义下面这样的宏,用来同步代码块
#define SCOPE_LOCK(l) TLockUse __lock_name(l)

下面是使用的代码

  1. void DoSomething()
  2. {
  3. SCOPE_LOCK(g_Lock1);
  4. SCOPE_LOCK(g_Lock2);
  5. // ...
  6. }

看起来很正常的用法,但不幸的是,编译的时候会报__lock_name重定义,至于原因,大家应该一眼就能看明白,但是解决方法,却不是那么完美,这时,我们就要借助一个宏__COUNTER__

  1. #define CONCAT_IMPL( x, y ) x##y
  2. #define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )
  3. #define SCOPE_LOCK(l) TLockUse MACRO_CONCAT(ThreadSafe, __COUNTER__)(l)

__COUNTER__的解释,可以参考MDSN文档

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注