Archive for September of 2007

MinGW で64bit整数を printf するときの注意

September 14, 2007
MinGW は Windows の C Library (MSVCR) を使うので普通は %lld を解釈してくれません。Cygwin から開発をしていると、この事を忘れてはまり易いので注意。
(環境 : Windows 2000 + gcc 3.4.5 (mingw special))

VC++ と同じように %I64u, %I64d を使えば大丈夫です。C++ コードならストリームを使えばとりあえず問題ないとのこと。

Google:MinGW lld I64d で関連情報がたくさん出てきます。

これは使用するランタイムを選択することでも解決できます。最新の MinGW Runtime をインストールし、Wrapper として libmsvcr80.a をリンクすることで MSVCR 8.0 を使えば %lld も正常に解釈されます。libmsvcr71.a 以前はだめです。



printf の話題なのでついでに

%llf は多くの C Library で結果的に拡張倍精度長浮動小数点数 (long double) の format として機能しますが、本来 long double の変換修飾子は L です。日頃から %Lf を使うようにした方が無難かと思います。

これはたとえば GNU C Library なら vfprintf.c のソースから is_long_double 周辺を見ればよくわかります。

MSVCR は %Lf も解釈してくれませんが。(だめじゃん)