読者です 読者をやめる 読者になる 読者になる

新しいVisual C++の下位互換性

VC++
推奨されなくなったC標準関数

新しいVC++では、scanfやstrcpyなどの、文字列の量が予測できないためにスタックオーバーフローを起こす可能性があるものは、セキュリティが良くないとみなされ、シグニチャの異なる関数に置き換えるべきだとされています。
スタックオーバーフローを意識して書いたソースコードなら、そんな忠告は時計なお世話ですね。これに関するコンパイラ警告を無視するには、コンパイラのオプションで

/D _CRT_NONSTDC_NO_DEPRECATE

とします。

http://msdn2.microsoft.com/ja-jp/library/ms235384%28VS.80%29.aspx

コンパイラバージョンによって型の長さが違う

同じ32ビットアーキテクチャ用のバイナリでも、VC++のバージョンによって、time_t型のバイト長が変わってきます。古いtime_tは32ビットで、新しいtime_tは64ビットの変数になります。バージョンの異なるVC++で作成されたobjもしくはlibファイルのtime_t型は、自分のコンパイラと互換性のない型かもしれません。

具体例を挙げると、Apache Portable Runtime(APR)には、time_tを再定義した引数を取る関数があり、Subversionはこれを利用しています。新しいVC++Subversion(もしくはSubversionを使ったアプリケーション)をビルドするとき、コンパイル済みのAPRをリンクすると、この問題が発生します。

64ビットtime_tが標準となったVC++で、time_tを32ビットとしてコンパイルするには、コンパイラオプションに

/D _USE_32BIT_TIME_T

を付けます。

http://msdn2.microsoft.com/ja-jp/library/ms235497%28VS.80%29.aspx

SDKバージョンの切り替え

http://d.hatena.ne.jp/tanakahisateru/20080724/1216839856
に挙げた例のように、VC++に添付されるWindowsのSDKバージョンによっては、すぐに、他の環境との互換性を失う問題が起こりえます。

ひとつのプロジェクトにバージョンの異なるVC++を使う場合、VC++添付のSDKのツールを使わず、共通のPlatform SDK/Windows SDKに切り替えることが重要です。Visual C++ 2005 Express Editionの使い方がヒントになるかもしれません。

http://www.microsoft.com/japan/msdn/vstudio/express/2005/visualc/usingpsdk/