Open fukuyasu opened 5 years ago
MinGWはランタイムライブラリとしてWindowsオリジナルのMSVCRTを使用していて,基本的にはC89に(ほとんど)基づいているらしい.
MinGW 64-bitでは,#define __MSVCRT__ 1
が定義されている.
MSYS2やUbuntu on WSLでは定義されていない.
MinGW 32-bitでも#define __MSVCRT__ 1
が定義されている.
マクロはcpp -dM /dev/null
(またはcpp -dM NUL
)で確認できる.
MinGW でも再現しない環境がある. Windows 10 1809では再現しないようだが,詳細は未確認.
記事によると #define __USE_MINGW_ANSI_STDIO 1
を指定することでも解決できそう.
再現しない環境(Win 10 1809)でも,-Wall
をつけてコンパイルするとwarningが出力される.
longnumber.c: In function 'ln_print':
longnumber.c:73:24: warning: unknown conversion type character 'z' in format [-Wformat=]
printf("(%4zu-%4zu)\n", sp, ep);
^
longnumber.c:73:29: warning: unknown conversion type character 'z' in format [-Wformat=]
printf("(%4zu-%4zu)\n", sp, ep);
^
longnumber.c:73:20: warning: too many arguments for format [-Wformat-extra-args]
printf("(%4zu-%4zu)\n", sp, ep);
^~~~~~~~~~~~~~~
-D__USE_MINGW_ANSI_STDIO=1
を指定すればwarningは出力されない.
size_t型に対するz修飾子はC99で導入されたことになっているが,いくつかの環境で出力に失敗する.
失敗する環境
成功する環境