C 言語 | 前処理 | トークン連結 ##

任意のトークンを結合する ## 演算子について説明する。主に、マクロへ渡した引数を別のマクロや値と結合するときに使う。

トークン連結演算子

#define で定義したマクロには、文字列化演算子のほかに重要な前処理演算子がある。2 つのシャープ記号で構成される ##、つまりトークン連結演算子である。通常のマクロと関数形式マクロの両方で使える。

## 演算子

トークン1 ## トークン2

トークン連結演算子は、左側と右側のトークンを結合する。これは前処理によるソースレベルの処理であり、プログラムの実行中に動的に結合するものではない。たとえば、WIN ## 32WIN32WIN ## 16WIN16 になる。

#define INT16 short
#define INT32 int
#define INT(n) INT ## n

INT() マクロはトークン INT と引数 n を結合する。たとえば、INT(16)INT16 に展開され、さらに short に展開される。

コード

#include <stdio.h>
#define TOKEN0 "Kitty"
#define TOKEN1 "Kitten"
#define TOKEN(n) TOKEN ## n

int main() {
  printf("%s\n" , TOKEN(0));
 printf("%s\n" , TOKEN(1));
 return 0;
}

TOKEN() マクロは、結合するトークンの末尾を受け取る。たとえば TOKEN(0)TOKEN0 を結合して TOKEN0 になる。TOKEN0#define で定義されているため、"Kitty" に展開される。

## で作成した新しいトークンは有効なトークンでなければならない。無効なトークンはコンパイルエラーになる。トークン連結はコンパイル前に行われるソースレベルの展開である。