Zigに自動変換できないC言語の例
zig translate-c
でかなりのものが変換できるが、ダメなものもある。現在のバージョンで試したところのまとめ。
zig translate-c のドキュメント
使用しているzigのバージョンはこちら。
$ zig version
0.9.1
@cImport
とzig translate-c
は同じロジックを使っているので、zig transate-c
でエラーになる箇所は@cImport
でも同様の扱いになる。
Zigに自動変換できないC言語の例
自分でいろいろと変換を試した時の結果のまとめ。
goto を使用している関数
その関数は変換されず、extern 扱いになる。
ビットフィールドを含むstruct
そのstructは opaque {}
になる。
C言語のビットフィールドはメモリ配置がコンパイラ依存でバイナリ互換性がないためだと思われる。
opaque {} をメンバに含むstruct
上記のビットフィールドを含むstructを実体をメンバとして含むstructが該当する。(opaque {}
へのポインタならば問題ない)
コンパイルエラーになる。そのstructを手でopaque {}
に書き換えれば、そのstructへのポインタは使えるようになる。
alloca()を使用している関数
その関数は変換されず、extern 扱いになる。alloca()
を一旦malloc()
とfree()
で書き換えてZigに変換し、その後にdefer
を使ってfree()
を呼ぶようにするとよいと思う。
__atomic_load()を含む関数
その関数は変換されず、extern 扱いになる。非同期処理関連の実装が進んでくれば変換できるようになるかもしれない。
'L'や'UL'がサフィックスとしてついている定数
コンパイルエラーになる。
Zigでは定数は型を持たないためだと思われるが、単にサフィックスを無視してくれたらいいのに。
'__attribute__'がついたマクロ
コンパイルエラーになる。
'__Complex' がついた型
コンパイルエラーになる。
そういえばZigのドキュメントにはComplex(複素数)についての記述がない。
ライブラリで対応。std.math.Complex
'__builtin_'で始まる関数
zigのビルトイン関数に変換できるものもあるが、対応していないものはコンパイルエラーになる。今後対応するものが増えるかもしれない。
関連
Discussion