解答15: C言語連携
概要
ZigとC言語の相互運用性を活用し、Cヘッダーのインポート、POSIX API、C互換関数のエクスポート、Cライブラリのラッピングについて学びます。
解答のポイント
1. @cImportの使い方
@cIncludeでヘッダーをインポート- null終端文字列の扱い
- C互換型への変換
2. POSIX APIの活用
- ファイルディスクリプタの管理
- エラーコードのチェック
- リソースの適切な解放
3. export関数
- C言語から呼び出し可能な関数
- c_int, c_longlong などのC互換型
- 対応するヘッダーファイルの作成
4. Cライブラリのラッピング
- 型安全なラッパー
- Zigのエラーハンドリング
- メモリ管理の統合
よくある間違い
null終端文字列
// 間違い
c.printf(path); // Zigの[]const u8は自動変換されない
// 正しい
const path_z = try allocator.dupeZ(u8, path);
defer allocator.free(path_z);
c.printf(path_z);
エラーハンドリング
// 間違い
const fd = c.open(path, c.O_RDONLY);
// エラーチェックなし
// 正しい
const fd = c.open(path, c.O_RDONLY);
if (fd < 0) return error.OpenFailed;
defer _ = c.close(fd);
発展課題
- libcurlを使ったHTTPクライアント
- SQLiteのZigラッパー
- OpenSSLを使った暗号化ライブラリ
- POSIX threadsのラッパー
- GTKを使ったGUIアプリケーション
まとめ
ZigのC言語連携は、既存のCライブラリを活用しながら、Zigの安全性と表現力を享受できます。