解答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の安全性と表現力を享受できます。