1

1 つのシステムに異なるファイル処理機能を混在させることは許可されていますか?

  • cstdio からの fopen()
  • fstream からの open()
  • Win API から CreateFile ?

多くのレガシー コードを含む大規模なアプリケーションがあり、このコード内で 3 つのメソッドすべてが使用されているようです。潜在的なリスクと副作用は何ですか?

4

3 に答える 3

2

はい、これらすべてを組み合わせることができます。いずれにせよ、それはすべて CreateFile 呼び出しに要約されます。

もちろん、ファイル ポインタを に渡してCloseHandle動作することを期待することはできません。また、 から開かれたハンドルが で動作することも期待できませCreateFilefclose

C++のmalloc/freenew/とまったく同じように考えてください。delete混合しない限り、同時に使用してもまったく問題ありません。

于 2010-07-07T15:31:44.133 に答える
1

相互作用する必要がない限り、これらのファイルメソッドをすべて使用してもまったく問題ありません。あるメソッドで開いたファイルを別のメソッドを想定する関数に渡す必要があるとすぐに、互換性がないことがわかります。

スタイルの問題として、私は1つを選び、それに固執することをお勧めしますが、コードが複数のソースからのものである場合、それは不可能かもしれません。多くの利益なしに既存のコードを変更することは、大きなリファクタリングの努力になるでしょう。

于 2010-07-07T15:33:53.777 に答える
1

あなたの状況はそれほど珍しいものではありません。

移植できるように設計されたコードは、通常、標準のファイル アクセス ルーチン ( 、 など) を使用して記述されfopenますopen。OS 固有のコードは、通常、その OS のネイティブ API を使用して記述されます。大規模なアプリケーションは、ほとんどの場合、これら 2 種類のコードの組み合わせです。同じプログラム内でファイル アクセス スタイルを混在させても問題はありませんが、それらをそのままにしておくことを忘れないでください (それらは互換性がありません)。

ここでの最大のリスクは、おそらく移植性です。しばらく前から存在しているレガシー コードがある場合、特に Win32 API より前の場合は、標準の C/C++ ファイル アクセス メソッドを使用している可能性があります。Win32 API の使用は許容されますが、コードをその API のスコープと有効期間にバインドしていることを認識する必要があります。そのコードを別のプラットフォームに移植するには、追加の作業を行う必要があります。また、たとえば、将来 Microsoft が Win32 API を廃止して何か新しいものを採用した場合は、このコードを作り直す必要があります。標準の C/C++ メソッドは常にそこにあり、一定で不変です。コードの将来性を保証したい場合は、可能な限り標準のメソッドと関数に固執してください。同時に、Win32 API を必要とし、標準関数を使用して実行できないことがいくつかあります。

C スタイル、C++ スタイル、および Win32 スタイルのコードを組み合わせて作業している場合は、OS 固有のコードと移植可能なコードを別々のモジュールに (合理的に可能な限り) 分離することをお勧めします。定義された API。将来的に Win32 コードを書き直す必要がある場合、これにより作業が簡単になります。

于 2010-07-07T15:58:52.227 に答える