再考:Visual C++ 9.0 SP1のランタイム問題

先日、「Visual C++ 9.0 SP1のランタイム問題」で書いた問題は、本当は問題なのかどうなのか。仕様といわれればそれまでっぽい。難しいのは、いままで、VS2003, VS2005は、SP1が当たったバージョンと当たってないバージョンでランタイムが異なっていたことだ。

これは実際のところ、かなり大きな問題で、スタティックリンクライブラリで商売をしている人々(僕を含む)にとってはかなり頭が痛い。というのも、SP1と無印は共存できないので、製品ビルド環境として、SP1環境と非SP1環境を維持しないといけないからだ。さらに、良心的なベンダーは良いが、悪いところになると、SP1を適用したバージョンのライブラリなのかどうかについて表記がなかったりする。

SP1が当たる当たらないで、STLにかなりの修正が入っていたりするので、SP1が当たっているライブラリと当たっていないライブラリをリンクしたりすると、単にstd::vectorを使っているだけのコードでクラッシュが起きたりする。

そういう背景を考えてみると、実は、今回の措置は意外と正しい選択な気もするわけだ。なぜなら、絶対にSP1を使いたい人は、

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

というのをヘッダの先頭に書けばいいわけで、これでライブラリはすべてSP1版になる。一方で、書かなければ無印版。そう考えると悪くない。

しかし、よくわからないのが、これはいったい本当はどういう意味なのかということ。調べてみても、オフィシャルな説明が見あたらない。単にmanifestだけが書き換わっているということはなさそうだけど、どこまでの影響範囲があるのか。そして、本当にこのマクロのON/OFFだけで無印互換/SP1互換のバイナリが生成されていると信じて良いのか。