3

いくつかの数学的計算を行う C ライブラリを設計しています。データを保存してからロードできるようにするには、シリアライゼーション インターフェイスを指定する必要があります。問題は、(バイナリ互換性の観点から) ライブラリのパブリック API で FILE* ポインターを使用することは正しいですか?

ターゲット プラットフォームは次のとおりです。

  • Linux x86、gcc >= 3.4.6 を使用する x86_64
  • Windows x86、x86_64 >= VS 搭載の WinXP >= 2008sp1

可能な限りバイナリ互換性を持たせる必要があるため、現時点で私のバリアントは次のとおりです。

void SMModuleSave(SMModule* module, FILE* dest);
SMModule* SMModuleLoad(FILE* src);

だから、 FILE* を使用するのが正しいのか、それとも wchar*/char* に切り替えるのが正しいのか知りたいです。

4

4 に答える 4

4

私は ThiefMaster に同意しません:同等のポータブル ソリューションがある場合、ネイティブにする (つまりint、Linux で型のファイル記述子を使用し、Windows で型のハンドルを使用する) ことに利点はありません。void *

ライブラリ内から名前でファイルを開くのではなく、おそらくFILE *使用します。ライブラリ ユーザーにとっては面倒かもしれませんが、ほとんどの libc 実装ではファイルを開くためのさまざまな方法が提供されているため、より柔軟です( fopen()_wfopen()_fdopen()fdopen()fmemopen()...) 個別のワイド文字 API を自分で維持する必要はありません。

于 2011-04-11T13:16:10.330 に答える
2

どちらも使用しませんが、ユーザーにファイル記述子をとして渡させますint

次にfdopen()、コードでそれを取得してを取得できますFILE*

ただし、Windowsを使用する場合、数値ファイル記述子を取得するためのヘルパー関数がいくつかあるとしても、それは最善の解決策ではない可能性があります。


ただし、aFILE*またはaを渡すconst char*ことも問題ありません。ライブラリがファイルの開閉を処理する場合、書き込むコードが少ないため、ファイル名を渡すことをお勧めします。

于 2011-04-11T12:46:41.117 に答える
1

はい、安定したバイナリ インターフェイスの観点から、ここで使用するのは正しいことFILE *です。FILEおそらく、これをポインタではなく使用と混同していると思います。標準ライブラリの 、 などの関数はすべて (引数と戻り値の両方として) 型をパブリック インターフェイスの一部として使用することに注意しfopenfgetsくださいFILE *

于 2011-04-11T14:31:47.887 に答える
0

AFILE *は、標準のANSI / ISO C89およびC99(K&Rでも)タイプです。それは携帯性の夢であり、私はそれを何よりも好むでしょう。あなたはそれで安全です。それ以上に良くなることはありません。

于 2011-09-03T18:57:45.250 に答える