ちゃんと/GXと/GRがサポートされてます。clarmでは/QRxscaleなんていうオプションもありますね。/QRarch5, /QRarch5Tなんてのも。
試しにEVC4のコンパイラを使って、2.1系をコンパイルしてみましょう。_MSC_VERが1220になっているみたいで、
#if _MSC_VER <= 1200になっているところで引っかかります。
#if _MSC_VER <= 1220にしたところその部分は通りました。
それから/Oiをつけて<stdlib.h>をincludeするとC2370のエラーになります。これもリリースノートによるとintrinsicがサポートされたと書いてあるので、これとのからみっぽいですね。多分、CE.NETのSDKなら大丈夫なんでしょうけれど、HPC ProのSDKなのでおかしいと。とりあえず/Oiは外すことに。
この二つの修正でコンパイルは通りました。実行してみたところ、一通り動作するようです。
とりあえず、2.1.16はこのコンパイラで作成してみて、問題ないかどうか検証してみることにしましょう。
EVC4には、CE.NETのStandard SDKというのが付いてくるんですが、この中にはちゃんとSTLも入っていました。ざっと見たところVC6についているやつと同じやつ(DinkumwareのOEM)のようです。ちなみにiostream周りとかは入っていませんね。
STLportで例外処理を有効にしてちゃんと動くかどうかがポイントでしょうか。
STLport-4.5.3のソースを見ていたら、config/stl_wince.hで、
# define _STLP_NO_THREADS 1
なんていうのを発見。昔はなかったはずなのにと思って順番に見ていったら、4.0の時にはなかったけれど、4.5には既に存在した。これが定義されていると、ノードアロケータの排他制御が働かないはず。そもそもconfig/stl_wince.hでは、
# undef _STLP_USE_NEWALLOC # define _STLP_USE_MALLOC
になっていてノードアロケータは使わないようになっているので本来なら影響なしということか?。でもデフォルトじゃ遅すぎるためノードアロケータを使うようにしているので、このままじゃ排他制御なしでノードアロケータを使っていることになるのか?。んー、いけてない。
と思ってもうちょっと見てみてると、config/stl_wince.hはconfig/stl_msvc.hからインクルードされているのだけれど、インクルードするより前に、
# if defined ( _MT ) && !defined (_STLP_NO_THREADS) && !defined (_REENTRANT) # define _REENTRANT 1 # endif
なんていうのがある。CEの場合_MTは必ず付くから、_REENTRANTは必ず定義されることになる。そんでもって、_config.hには、config/stlcomp.hをインクルードした後(つまり、config/stl_msvc.hをインクルードした後)に、
# if defined (_REENTRANT) && ! defined (_STLP_THREADS) # define _STLP_THREADS # endif /* _REENTRANT */
なんていうのがある。ということは、_STLP_THREADSは定義されるのか?。ノードアロケータがスレッドセーフかどうかを定義しているのは、stl/_alloc.hの
#if defined (_STLP_THREADS) || (defined(_STLP_OWN_IOSTREAMS) && ! defined (_STLP_NO_THREADS) && ! defined (_NOTHREADS) ) # define _STLP_NODE_ALLOCATOR_THREADS true #else # define _STLP_NODE_ALLOCATOR_THREADS false #endif
なので、_STLP_THREADSが定義されていれば、_STLP_NO_THREADSが定義されていようがいまいが、スレッドセーフになるはず。んー、一体どうなっているんだか。デバッガで追わないとどこに入っているのかさっぱりわからん。
そもそも、_STLP_NO_THREADSと_STLP_THREADSの両方があるのはわかりにくくないか?