ユニークなシンボルを自動生成

デバッグ用のマクロ等で時々必要となる,ユニークなシンボル名(関数名とか変数名)を自動生成するマクロ

#define CAT_I(a,b) a##b
#define CAT(a,b) CAT_I(a,b)
#define UNIQSYM(tag) CAT(tag, __LINE__)

使い方はこんな感じ

int UNIQSYM(hogehoge) = 123;

これで"hogehoge行番号"という変数名が自動生成できる

利用例としては

#include <stdio.h>

#define CAT_I(a,b) a##b
#define CAT(a,b) CAT_I(a,b)
#define UNIQSYM(tag) CAT(tag, __LINE__)

#define TRACE(tag) \
static int UNIQSYM(tag) = 0; printf("%s: %d\n", #tag, UNIQSYM(tag)++)

int 
main()
{
   for (int i=0; i<10;++i) {
     TRACE("case-1");

      if (i<5)
        break;
  
     TRACE("case-2");
  }
  return 0;
}

ちなみに,マクロCATとCAT_Iは,boost ライブラリの boost/preprocessor/cat.hpp と同じテクニック.最初にCAT_I()で hogehoge と __LINE__ を ## で連結して,出来上がった hogehoge__LINE__を CAT()で再度プリプロセスすることで hogehoge行番号 に展開している.