1

レガシ C++ システムを VC6 から VC9 に移植しています。

アプリケーション (社内で開発されたが別のチームによって開発され<APP A>)た内部アプリケーションに静的にリンクします。 からのヘッダー ファイルのローカル コピーはCPP ファイルに含まれ、でコンパイルされます。<APP B><APP B><APP A>.

現在<APP B>、VC9 に移行する予定はありません。<APP A><APP B>は別々の CRT を使用しますが、競合は予想されません。

私たちが直面している問題は、( のローカル コピー) からのインクルード ファイルが VC9 でコンパイルされないことです。

致命的なエラー C1083: インクルード ファイルを開けません: 'iostream.h': そのようなファイルまたはディレクトリはありません

<APP A>考えられる解決策: VC9のローカル コピーに変更を加えてコンパイルすると、実行時に何らかの問題が発生する可能性があるかどうかわかりません。

の代わりにVC9 に<APP A>ファイルをコンパイルするように依頼できる他の方法はありますか?<iostream.h><iostream>

4

3 に答える 3

4

申し訳ありませんが、あなたはたくさんの問題を抱えています。

最初の基本:<iostream.h>は、たとえばを定義するために使用された古いMicrosoftヘッダー::coutです。<iostream>は標準ヘッダーであり、たとえばを定義しますstd::cout。これらの両方を使用できますが、このヘッダーはに含めないAPP.Hでください。<iostream>宣言で使用する型は定義しません。おそらく、VC6実装のアーティファクト、つまりプルインされたアーティファクトに依存していると思わ<iostream.h><istream.h>ます<ostream.h><iosfwd>代わりに、ヘッダーで使用することを目的としに切り替えることをお勧めします。

ただし、より大きな問題は、VC6とVC9でコンパイルされている場合でも、「APPA」とAPPBをリンクできるという仮定です。これは、APIを共有している場合にのみextern "C"当てはまります。C++の名前マングリングは(意図的に) )それらの間で異なります。そして、あなたが<iostream.h>代わりに言及したので<stdio.h>、私はあなたのコモンが本当にC++であると仮定するつもりです。

于 2010-08-30T09:42:00.537 に答える
1

このコンパイラ エラーが唯一の問題になるとは思えません。コンパイラを更新すると、ほとんどの場合、少数の問題が発生します。これらの競合を解決し、結果を真剣にテストするのが最善です。とにかくコンパイラが違うので、いくつかの「回避策」が問題を軽減するとは思いません。

異なるコンパイラを並行して使用する場合のこのような問題を解決する唯一の解決策は、次のような条件付きコンパイルです。

#if _MSC_VER >= 1200 
   // Code for VC 6.0 or higher goes here
#endif

_MSC_VERVisual Studio のバージョンとは番号が異なりますのでご注意ください。Visual Studio 2010 の場合、ie_MSC_VERは 1600 として定義されます。

于 2010-08-30T09:15:56.883 に答える
1

このタイプのプロジェクトについては、Michael Feathers による素晴らしい本http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052があります。

簡単な答えは、テストがある場合は、必要な変更とリファクタリングを行い、テストを再実行することです。あなたの例では、プリプロセッサ ディレクティブを使用して、コンパイラのバージョンに基づいて適切なインクルードを選択し、壊れたテストを修正します。

テストがなければ、もう少し問題が発生します。テストを作成するか、何も壊さないように祈る必要があります

于 2010-08-30T08:32:44.450 に答える