fukuyasu / long_number

Library for operating numbers with long fraction part
0 stars 0 forks source link

printfの%zu修飾子への対応状況の確認 #9

Open fukuyasu opened 5 years ago

fukuyasu commented 5 years ago

size_t型に対するz修飾子はC99で導入されたことになっているが,いくつかの環境で出力に失敗する.

失敗する環境

成功する環境

fukuyasu commented 5 years ago

MinGWはランタイムライブラリとしてWindowsオリジナルのMSVCRTを使用していて,基本的にはC89に(ほとんど)基づいているらしい.

fukuyasu commented 5 years ago

MinGW 64-bitでは,#define __MSVCRT__ 1が定義されている. MSYS2やUbuntu on WSLでは定義されていない.

fukuyasu commented 5 years ago

MinGW 32-bitでも#define __MSVCRT__ 1が定義されている.

fukuyasu commented 5 years ago

マクロはcpp -dM /dev/null(またはcpp -dM NUL)で確認できる.

fukuyasu commented 5 years ago

MinGW でも再現しない環境がある. Windows 10 1809では再現しないようだが,詳細は未確認.

fukuyasu commented 5 years ago

記事によると #define __USE_MINGW_ANSI_STDIO 1 を指定することでも解決できそう.

fukuyasu commented 5 years ago

再現しない環境(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は出力されない.