K&R C では、2 つのトークンを連結するために、少なくとも 2 つの方法がありました。次のコード内の両方の呼び出しは、2 つのトークン x と 1 から 1 つの識別子 x1 を生成します。
#define self(a) a #define glue(a,b) a/**/b ? self(x)1 glue(x,1)
ISO C では、どちらの方法も使用できません。ISO C では、どちらの呼び出しも、2 つの別々のトークン x と 1 を生成します。2 つのうちの 2 番目の方法は、## マクロ置換演算子を使用することで、ISO C 用に書き換えることができます。
#define glue(a,b) a ## b glue(x, 1)
# と ## は、__STDC__ が定義されているときだけ、マクロ置換演算子として使用しなければいけません。## は実際の演算子のため、定義と呼び出しの両方で空白について呼び出しをより自由に行うことができます。
コンパイラは、未定義の ## 演算に対して警告の診断を発行するようになりました (C 規格、3.4.3 セクション)。未定義とは、## を前処理したときの結果に、単一のトークンではなく、複数のトークンが含まれていることを意味します (C 規格、6.10.3.3(3) セクション)。未定義の ## 演算の結果は、現在では、## のオペランドを連結することによって作成された文字列をプリプロセスすることによって生成された個別のトークンのうち最初のものと定義されます。
2 つの古い連結方法のスキームのうち、最初の方法を再現するための直接的なアプローチは存在しません。しかし、呼び出し時に連結の負荷が発生するため、もう 1 つの方法に比べてあまり使用されせんでした 。