C > define > トークン連結演算子(##) / 文字列化演算子(#) > PAR(iter)


C++で書かれた数値シミュレーションコードADDA。
そこに以下のような定義があった。

param.c
#define PARSE_NAME(a) parse_##a

"##"は本で目にしたことがある程度の知識。

調べてみた。

トークン連結演算子 (##)

用語名は拾えた。

以下の方が説明になるようだ。
https://msdn.microsoft.com/ja-jp/library/09dwwt6y.aspx

二重シャープ記号またはトークン連結演算子 (##) は、"マージ" 演算子と呼ばれることもあり、オブジェクトのようなマクロと関数のようなマクロの両方で使用されます。 この演算子を使用すると、別々のトークンを 1 つのトークンに結合できます。

1つの#と 2つの##の違いは未消化。

#と##の違い。

以下が参考になった。
http://www.booran.com/menu/c/macro.html

トークン連結演算子(##) / 文字列化演算子(#)という違いがあるようだ。
変換例が上記リンクで紹介されている。

関連の定義

最初のPARSE_NAME()の定義に合わせて、他の定義も含めてのは以下。

param.c
#define PARSE_NAME(a) parse_##a
#define PARSE_FUNC(a) static void PARSE_NAME(a)(int Narg ATT_UNUSED,char **argv ATT_UNUSED)
#define PAR(a) #a,PARSE_NAME(a),false

PAR(iter)のようにしてコールされる。
それが以下のようになるということか。

PAR(iter)
iter,PARSE_NAME(iter),false
iter,parse_iter,false

以下で使われている。

param.c
    {PAR(iter),"{bcgs2|bicg|bicgstab|cgnr|csym|qmr|qmr2}","Sets the iterative solver.\n"
        "Default: qmr",1,NULL},