実は <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 で始まる文字列リテラルの連結はどうなっているんでしょうね。また、調べておかないと...

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/707

こんばんは。 >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>を公開していますので、よければ使ってやってください。

このエントリーを含むはてなブックマーク