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

标签 c++ c

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

相关文章:

c++ - 第二次无法捕获段错误

c++ - MSVC 中的 Constexpr 友元函数

c++ - C++使用Visual Studio 2020不能使用.length()

c - doxygen 变量被识别为函数

c - 在理解从 C 代码生成的基本汇编代码方面需要帮助

C fileIO 不符合预期

c++ - 输入 int 和 str 并将它们存储到两个单独的列表中

c++ - 请澄清术语类静态对象(与类静态成员)

c - 编辑 makefile 以允许在 linux 中进行调试

c - 预设列表中的随机数