こんにちは、高木です。

引き続きPHPでC言語の前処理を行う話題になります。前回前々回で、PHPからC言語の型の情報を取得する方法について解説しました。今回は、C言語では同じ型であっても別名が付いていることがあるので、元の型名というか、配列定数C_LIMITSのキーに使える型名に変関数方法について考えていきます。

C言語で型に別名を付ける方法の代表格はtypedefです。標準ライブラリでもtypedefを使った別名がいくつも定義されています。具体例を挙げると、size_t, ptrdiff_t, wchar_tなどなどです。これらの対応表を次のような配列定数で定義してあげることにしましょう。

これはあくまでも定義の一部です。ほかにも必要なだけ配列の要素を追加していく必要があります。GCCやClangであれば、次のようにすればtypedefで定義される内容をある程度把握することができます。

上記はGCCの場合です。Clangであれば、gccの代わりにclangコマンドを使うだけです。結果は以下のように出力されます(どんな型に定義されるかは環境によります)。

この結果から自動生成することもできますが、この程度なら手作業でやってもいいかもしれませんね。

型に別名を付ける方法はtypedefだけではありません。先ほどの出力結果のようにマクロを使って別名を付けることもできます。C言語の標準ライブラリでも、マクロを使った型の別名定義が行われています。具体的にはboolマクロがそうです。ですので、配列定数C_TYPEDEFSに次の要素を追加することにしましょう。

 

さらに、別名の定義とは違いますが、算術型は同じ型であっても型指定子の表現が複数あります。たとえば、long型であれば、次の11通りの表現が考えられます。

こうした別名の配列定数C_TYPEDEFSの要素として追加しておくとよいでしょう。

上記のような要素は一見必要なさそうですが、いっしょに追加しておけば型名の変換処理を完結にできます。

配列定数C_TYPEDEFSの自動生成は、手間の割には得るものが少ないですので、手作業でやった方がいいでしょうね。