__COUNTER__
符号由 VC++ 提供和 GCC,每次使用都会给出一个递增的非负整数值。
我有兴趣了解是否有人使用过它,以及它是否值得标准化?
最佳答案
__COUNTER__
在您需要唯一名称的任何地方都很有用。我已将它广泛用于 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 );
// ...
}
为锁的用途命名会很乏味,如果它们没有全部声明在 block 的顶部,甚至会成为错误的来源。你怎么知道你是在 lock_use4
还是 lock_use11
?这也是对命名空间的不必要污染——我永远不需要按名称引用锁使用对象。所以我使用 __COUNTER__
:
#define CONCAT_IMPL( x, y ) x##y
#define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y )
#define USE_LOCK( lock ) TLockUse MACRO_CONCAT( LockUse, __COUNTER__ )( lock )
void DoSomething2()
{
USE_LOCK( g_Lock1 );
USE_LOCK( g_Lock2 );
// ...
}
但是不要纠结于我将对象称为锁这一事实——任何需要成对调用的函数都适合这种模式。您甚至可能对给定 block 中的同一个“锁”有多种用途。
关于c++ - 有没有人使用过 __COUNTER__ 预处理器宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/652815/