🤖

Zigに自動変換できないC言語の例

2022/07/21に公開

zig translate-cでかなりのものが変換できるが、ダメなものもある。現在のバージョンで試したところのまとめ。

zig translate-c のドキュメント

使用しているzigのバージョンはこちら。

$ zig version
0.9.1

https://ziglang.org/documentation/0.9.1/#toc-C-Translation-CLI

@cImportzig 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
https://ziglang.org/documentation/master/std/#std;math.Complex

'__builtin_'で始まる関数

zigのビルトイン関数に変換できるものもあるが、対応していないものはコンパイルエラーになる。今後対応するものが増えるかもしれない。

関連

https://zenn.dev/tetsu_koba/articles/95ce0deb9a6704
https://zenn.dev/tetsu_koba/articles/421198dc669f19

Discussion