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スタイルのキャストは、これまでと同じセマンティクスで引き続き有効ですが、新しいコードでは、少なくともポインターや参照が含まれる場合は、それらを避けたいと思うでしょう。 )。