正如注释中的错误报告讨论所建议的那样,Microsoft的
printf功能不支持C99。mingw-w64项目提供了替代功能,如果
__USE_MINGW_ANSI_STDIO在包含任何标头之前或在命令行上将宏设置为1
,则它们可以像正常的C99功能一样使用。它们支持标准
%zu,
%jd等格式说明符,即使最新的MSVCRT版本也不支持。您可以直接使用调用该函数
mingw_printf,但通常只需将上述宏定义为1并调用
printf,这样会更容易。
值得注意的是,如果使用Microsoft的
snprintf,如果缓冲区不够大,它将返回-1表示截断,除非buffer和buffer
size参数分别为
NULL和0,在这种情况下,将输出的字节数为回。C99的行为是始终返回如果缓冲区足够大时将输出的字节数,如果出现编码错误则返回负值,并且mingw-w64实现似乎按照C99正确地运行。
为了使用所有这些标准行为,您需要做的只是
#define __USE_MINGW_ANSI_STDIO1在使用任何
printf函数之前都包含在其中,或者只是添加
-D__USE_MINGW_ANSI_STDIO=1到编译器调用中。
If you are worried about the macro interfering with other platforms, no other
implementation except the original (legacy?) MinGW[32] project that provided
similar functionality should actually make use of this preprocessor macro, so
it is safe to define it unconditionally.



