こんにちは、高木です。
前回のように、PHPの配列を使って構造体を定義しておけば、その構造体のメンバー一覧を取得するのは簡単です。
まずは、前回作ったmake_struct関数が出力する構造体の定義から見ていきましょう。
0 1 2 3 4 5 |
typedef struct { char name[32]; int age; } person_t; |
上のような、nameとageという2つのメンバーを持つ単純な構造体を出力します。扱いやすいように構造体にはperson_tというtypedef名を付けるようにしています。この構造体のメンバーの値を、以下のような書式で標準出力に書き込む文を自動生成したいと思います。
0 1 2 |
.name = 文字列 .age = 整数値 |
make_struct関数に渡した配列と同じ配列を使えば、簡単に実現することができます。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php function dump_struct(string $object, array $type): string { $format = ''; $args = ''; foreach ($type as $key => $value) { // 2つめ以降のメンバーの場合、区切りを挿入する。 if (strlen($format) !== 0) { $format .= ' '; $args .= ', '; } $format .= ".$key = "; if (is_array($value)) { $format .= "%s"; } else { $format .= "%d"; } $args .= "$object.$key"; } return "printf(\"$format\\n\", $args);\n"; } ?> |
今回は話を簡単にするために、配列であれば必ず文字列、配列でなければ必ずint型と決め打ちにしています。実際には、さまざまな型に対応できるようにif文やswitch文を書き足す必要があります。
先ほど作ったdump_struct関数は次のようにして使います。
1 2 3 4 5 6 7 8 9 |
int main(void) { person_t student = { "Taro", 15 }; <?php echo dump_struct('student', $person_type); ?> } |
上のコードの5行目から7行目にPHPのコードが挿入され、その中でdump_struct関数を読んでいますね。第1引数にはperson_t型の変数の名前を指定しています(ここでは’student’)。このコードをPHPにかけてあげると次のようなC言語のソースコードができあがります。
1 2 3 4 5 6 7 |
int main(void) { person_t student = { "Taro", 15 }; printf(".name = %s .age = %d\n", student.name, student.age); } |
今回は構造体のメンバーをダンプしてみましたが、メンバーの一覧さえ取得できればほかにもいろいろなことができそうです。うまく使えば、テストコードの自動生成なんかもできそうですね。
次回は、今回とよく似ているのですが、PHPの配列を使って列挙体を定義して、列挙定数を文字列化するコードを書いてみようと思います。