実は <inttypes.h> も公開しているのですが...
かなり前に公開したVisual C+用の <stdint.h> が、いまだにいろいろなところで使われているようです。そもそもVisual C++がサービスパックを出してもバージョンアップしても、一向にC99に対応する気配がないことに問題があるのですが...。
それはそうと、実をいうともう1年半近くも前に、Visual C++用の <inttypes.h> も作って公開していたりします。
http://file.dradnats.org/inttypes-20081030.zip
ちゃんとテストしていないので、ベクターにも登録していなかったのが原因なのか、あるいはまったく必要とされていないのか、どうも使われている形跡がありません。多少なりとも反響があれば、もう少しまともなものに仕上げてもよいかと考えています。
C++を使う場合でも、printf系関数の書式指定の便利さはなかなか捨てられないもので、ostringstream より sprintf や snprintf が多用される傾向にあるように思います。それなら <inttypes.h> も必要になるような気もするのですが。
Windowsプログラマの多くは、移植性なんかまったく考えない人が多いのか、intでもlongでもsize_tでも、ひどい場合にはポインタでさえ、%d や %x で変換しているケースを見ることが多々ありますからねえ。そういう状況であれば、int32_t の書式は問答無用で %d を使ってしまえるのでしょう。PRId32 マクロの出番なんかないのかもしれません。あるいは、(思いっきり独自仕様の)%I32d とするからかまわないということでしょうか?
ところで、ずっと前に公開したこの <inttypes.h> ですが、やむにやまれぬ事情で一部の仕様をサポートしていません。別にシェアウェアとかそういうことではありません。Visual C++の場合、ナロー文字列の場合は "hello" "world" のように、ワイド文字列の場合は L"hello" L"world" のようにしなければなりません。けれども、PRId32 などのマクロはナロー文字列でもワイド文字列でも使えないといけないのです。
しかたがないので、_UNICODEマクロの定義状態で L を付けるかどうかを切り替えています。本当は仕様違いですが致し方ありません。そういえば、Visual C++ 2010では char16_t や char32_t もサポートされるはずですが、u や U で始まる文字列リテラルの連結はどうなっているんでしょうね。また、調べておかないと...


こんばんは。 >ostringstream より
こんばんは。
>ostringstream より sprintf や snprintf が多用される傾向にあるように思います。それなら
><inttypes.h> も必要になるような気もするのですが。
boostを使っている、ということもあるのではないでしょうか。boost::formatとかで一応変換はできますし…
それと、boost関連で、boostのcstdint.hppにuintptr_tがない、というのが少し不思議です、もしかしてuintptr_tというのはあまり需要が無いのでしょうか?
>PRId32 などのマクロはナロー文字列でもワイド文字列でも使えないといけないのです。
C++0xではどうなるのでしょうか、C99と同じになればいいのでしょうけれど…
コメントありがとうございます。
> boostを使っている、ということもあるのではないでしょうか。
意外に普及していませんよ。
それにboost::formatはsprintfなんかに比べると重いので、軽量な関数が好まれるのかもしれません。
> boostのcstdint.hppにuintptr_tがない、というのが少し不思議です
C99でもintptr_tとuintptr_tは任意実装ですからね。
> C++0xではどうなるのでしょうか、C99と同じになればいいのでしょうけれど…
C++0xでは、<cinttypes>が導入されます。
>>
>> boostを使っている、ということもあるのではないでしょうか。
>意外に普及していませんよ。
>それにboost::formatはsprintfなんかに比べると重いので、軽量な関数が好まれるのかもしれません。
そうなんですか…
やはりiostream系は微妙に遅いのでしょうか。
>C99でもintptr_tとuintptr_tは任意実装ですからね。
そうだったんですか…
今はPOCOのUIntPtrやIntPtrでしのいでいます。本当はポインタ⇔整数のキャストは避けるべきなのでしょうけれども…
C++0xで、Windows APIがどのように変化していくのかが少し楽しみです。VC2010がどこまで0xに対応するか分からないのですが…
>
> やはりiostream系は微妙に遅いのでしょうか。
遅いしデカイですね。
iostream系を使うと、もれなくlocaleやそれにぶら下がっているファセットがついてきます。_byname系のライブラリが付いてきますので、サポートしている全ロケールのライブラリがリンクされるかと思います。
> 今はPOCOのUIntPtrやIntPtrでしのいでいます。
GCCには<stdint.h>がありますし、Visual C++でも<crtdefs.h>でintptr_tやuintptr_tが定義されています。
うちでもVC++ようの<stdint.h>を公開していますので、よければ使ってやってください。