gpt4 book ai didi

c++ - 有没有人使用过 __COUNTER__ 预处理器宏?

转载 作者:IT老高 更新时间:2023-10-28 13:58:57 28 4
gpt4 key购买 nike

__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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com