こんにちは、高木です。

例によって、今回もPHPでC言語の前処理を行う話題です。前処理を行うにあたって、ちょっと凝ったことをやろうとすると、C言語の処理系に依存する情報が必要になってきます。今回は、算術型(正確には実数型)に関するさまざまな定数を定義することにします。

PHPに定数値を与える方法はいろいろあります。たとえば、JSONやXMLなどで定義して実行時に読み込ませる方法があります。ほかにはphp.iniのようなINIファイルとして定義する方法も考えられます。今回は、おそらくもっとも素直だと思われる、defineを使って配列を定義する方法を採用したいと思います。

まずは仕様を考えなければなりません。サンプルとしてchar型の情報だけを定義した配列を考えてみます。

こんな感じで、型ごとに配列に要素を定義していきたいと思います。このやり方の利点は、任意の型名をパラメータにして、情報を取り出しやすいことにあります。

それぞれの情報が何を意味しているのかは一目瞭然だと思いますが、一応説明しておきます。

「max」はその型の最大値、「min」は最小値です。一点注意しないといけないのは、最大値と最小値は文字列として定義しているということです。これはどういうことかというと、PHPのint型もC言語と同じように環境依存だということが挙げられます。8ビットぐらいなら問題ないのですが、32ビット以上になるとこの問題に直面します。PHPではint型で表現できない数値はfloat型になってしまうので、末尾の桁が落ちてしまう可能性があります。文字列として持っておけば、そのまま出力してC言語のソースコードに埋め込むこともできますし、必要なら多倍長演算を行うこともできます。

「signed」は、その型が符号付きかどうかを表します。trueであれば符号付き、falseであれば符合無しになります。

「size」は、その型をオペランドとするsizeof演算子の評価結果です。「align」は、その型が要求する境界調整数です。これらはそんなに大きな値になることはないので文字列にする必要はないでしょう。「size」と「align」は、たとえば構造体の定義を自動生成する場合、構造体のサイズやメンバのオフセットを求める際に必要になってきます。

それぞれの型について、手作業で定義していってもいいのですが、こういうのは自動で生成した方がよさそうです。自動生成の方法については、次回に回したいと思います。