PCP: C++ Preprocessor 1.0.a1
高木です。おはようございます。
先日予告した通り、PCP: C++ Preprocessorのα版を公開します。
まだまだ実装しきれていない機能も多いですし、不具合も残っているとは思いますが、それなりに使えるレベルにはなってきたと思います。
>> PCP: C++ Preprocessor 1.0.a1のダウンロード
一応ドキュメントも入っているのですが、どんな感じか雰囲気をつかんでいただくためにサンプルを貼っておきます。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <?= pcp\pascal_case('This is a pen'); // パスカルケース ?> <?= pcp\pascal_case('This is a pen', true); // キャメルケース ?> <?= pcp\snake_case('This is a pen'); // スネークケース ?> <?= pcp\convert_to_ucn('これはテストです。'); ?> <?= // 構造体の生成 pcp\struct([ 'struct' => 'test', [ 'a' => pcp\int_t, 'b' => pcp\double_t, 'c' => 'int (*%s)()', 'd' => [ '*' => [ 'fn' => '%s', [], pcp\int_t ] ], 'e' => [ '*' => [ pcp\int_t, 'const' ] ], ] ]); ?> <?= pcp\static_assert(0); // 言語やバージョンに応じて出し分け可能なstatic_assert ?> <?= // 列挙体の生成 pcp\enum([ 'enum' => ['A', 'class', 'short' ], [ 'a', 'b', 'c' => 10 ] ]); ?> <?= // 関数頭部の生成 pcp\fn([ 'fn' => [ 'foo', 'extern', 'inline' ], [ 'a' => pcp\short_t, 'b' => [ '[]' => [ pcp\int_t, 'static', 10 ] ] ], pcp\int_t ]); ?> <?= // pcp\typeのサンプル pcp\type([ '*' => [ [ 'fn' => '%s', [], pcp\int_t ], 'volatile', 'const' ] ]); ?> <?= // インデントされたコードを1行化 pcp\single_line(<<<EOT struct B { int a; int b; } EOT ); ?> <?= // 文字列リテラルの生成 pcp\string_literal(<<<EOT abc def ghi EOT ); ?> |
上記のコードを処理した結果は下記のようになります。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #line 1 "C:\msys64\home\ユーザー名\a.pcp" ThisIsAPen #line 2 thisIsAPen #line 4 this_is_a_pen #line 6 \u3053\u308c\u306f\u30c6\u30b9\u30c8\u3067\u3059\u3002 #line 8 struct test { int a; double b; int (*c)(); int (*d)(); const int* e; } ; #line 20 static_assert(0); #line 22 enum class A : short { a, b, c = 10 }; #line 32 extern inline int foo(short a, int b[static 10]); #line 39 volatile const int (*%s)() #line 44 struct B { int a; int b; } #line 54 "abc\ndef\tghi" #line 61 |
#line指令はオプションで外せますが、デバッグ中は出力するようにしたほうが便利ですね。
とりあえず今回は単に公開するだけにしておきます。
追って、いろいろ説明していければと考えています。