2

数ヶ月前、私は次の質問を投稿し ましたVS6.0のテンプレートの問題

その後の議論とあなたのコメントは、新しいコンパイラを手に入れることが必須であることに気付くのに役立ちました-または基本的に、それらは私を動かした最後の火付け役でした。社内での「ロビー活動」を1か月行った後、ようやくVS2012を取得しました。(君たちありがとう)

私が使用しなければならないいくつかの古いツールはVS6.0で開発されました
。私の懸念は、これらのツールのいくつかが新しいコンパイラで動作しない可能性があることです。これが、VS6とVS2012の主な違い、または少なくともVS6とVS2010の違いを誰かが指摘できるかどうか疑問に思っていた理由です。2010年から2012年までの変更は、オンラインで十分に文書化されています。

明らかに、VS6.0とVS12の違いは非常に大きいはずです...私は主にキャストなどの基本的なことに関心があります。Web上にVS6.0に関する情報はほとんどありません-そして私はやや途方に暮れています:(

同じクラスで新しいプロジェクトを作成する必要があると思います。2番目のステップでは、.hファイルと.cppファイルを古いツールのもので上書きします。したがって、少なくとも新しいコンパイラを介してファイルを開くことができます。それでも一部のキャストまたはクラス定義はサポートされていない可能性があり、デバッグ中に何を探すべきかについての一般的なアイデアが欲しいです:)

4

1 に答える 1

4

VS 6.0がリリースされて以来、言語は大幅に進化しました。VS6.0はC++98より前のものです。VS2012はC++03であり、C++11のいくつかの機能があります。

新しい言語機能のほとんどは、上位互換性があります。古いコードは引き続き機能します。それでも、VC 6.0は先行標準であり、以前の標準がなかった場合(および実装が異なっていた場合)、委員会は既存のコードを壊すことについてあまり心配していませんでした。問題を引き起こす可能性のある言語には(少なくとも)いくつかの側面があります。

1つ目は、VC6.0がで定義された変数に古いスコープを使用していたことforです。したがって、VC 6.0では、次のようなことが合法でした。

int findIndex( int* array, int size, int target )
{
    for ( int i = 0; i < size && array[i] != target ; ++ i ) {
    }
    return i;
}

これはVC2012ではコンパイルされません(グローバル変数も存在しないi場合は、ローカル変数ではなく、グローバル変数が返さます)。

IIRCも、VC 6.0は、アクセス制御と定数の適用に関してそれほど厳密ではありませんでした。ただし、移行する場合、これは問題にならない可能性があります。これは、VC 2012が、少なくともデフォルトオプションでは、より重大なケースのいくつかでC++98に準拠できないためです。(たとえば、一時的なものを非定数参照にバインドすることもできます。)

下位互換性がないもう1つの主要な言語変更は、テンプレートでの名前検索です。ただし、ここでも、VC 2012でも、Microsoftは標準前の名前ルックアップを実装しています(つまり、C ++ 98より前)。コードを他のコンパイラに移植する場合、これは深刻な問題ですが、VC6.0からVC2012への移行がはるかに簡単になります。

ライブラリに関しては、6.0がC ++ 98ライブラリをサポートしていたのか、それともまだ先行標準であったのか(あるいは両方をサポートしていたのか)を思い出せません。コードに次のようなものが含ま#include <iostream.h>れている場合は、ここでいくつかの違いに備えて<<ください >>。複雑なものを実装する場合はメジャーstreambuf。そしてもちろん、すべてのライブラリはグローバル名前空間からに移動されました std::

残りの部分については、VC6.0の登場後に導入された機能をコードで使用しないことは明らかです。これによって移行の問題が発生することはありませんが(古い機能は引き続きサポートされているため)、間違いなく戻って、移行したらコードを徐々にアップグレードすることをお勧めします。(キャストについて言及しました。これは良い例です。Cスタイルのキャストは、これまでと同じセマンティクスで引き続き有効ですが、新しいコードでは、少なくともポインターや参照が含まれる場合は、それらを避けたいと思うでしょう。 )。

于 2013-03-21T09:44:35.710 に答える