デバッグ用のマクロ等で時々必要となる,ユニークなシンボル名(関数名とか変数名)を自動生成するマクロ
#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行番号 に展開している.