C程序转换到Windows后显示%zu

我通过Mingw在windows上编写了一个linux程序。 但是,程序的输出在Windows上看起来与在Linux上不同。

例如,在Windows上,输出是这样的(我得到“zu”而不是实数):

Approximated minimal memory consumption: Sequence : zuM Buffer : 1 X zuM = zuM Table : 1 X zuM = zuM Miscellaneous : zuM Total : zuM 

在Linux上,原始程序编译(没有Mingw)警告。 在Windows下,在Mingw下,它编译为零警告。

有什么我应该知道的?
Mingw是否提供100%的兼容性,或者我必须修改程序才能在Win上工作?

我不知道在哪个方向前进。 我应该从哪里开始修复程序?
你认为Cygwin有更好的机会吗?


更新:
维基百科提到:“缺乏对C99的支持导致了移植问题,特别是有关printf风格转换说明符的问题。
这是我撞了我的头吗?

更新:
我的明版是:

 MINGWBASEDIR=C:\MinGW gcc version 4.8.1 (GCC) gcc version 4.8.1 (GCC) GNU gdb (GDB) 7.6.1 GNU ld (GNU Binutils) 2.24 GNU windres (GNU Binutils) 2.24 GNU dlltool (GNU Binutils) 2.24 GNU Make 3.82.90 #define __MINGW32_VERSION 3.20 #define __W32API_VERSION 3.17 

(我用这个代码来获取版本:

 @echo off REM version-of-mingw.bat REM credit to Peter Ward work in ReactOS Build Environment RosBE.cmd it gave me a starting point that I edited. :: :: Display the current version of GCC, ld, make and others. :: REM %CD% works in Windows XP, not sure when it was added to Windows REM set MINGWBASEDIR=C:\MinGW set MINGWBASEDIR=%CD% ECHO MINGWBASEDIR=%MINGWBASEDIR% SET PATH=%MINGWBASEDIR%\bin;%SystemRoot%\system32 if exist %MINGWBASEDIR%\bin\gcc.exe (gcc -v 2>&1 | find "gcc version") REM if exist %MINGWBASEDIR%\bin\gcc.exe gcc -print-search-dirs if exist %MINGWBASEDIR%\bin\c++.exe (c++ -v 2>&1 | find "gcc version") if exist %MINGWBASEDIR%\bin\gcc-sjlj.exe (gcc-sjlj.exe -v 2>&1 | find "gcc version") if exist %MINGWBASEDIR%\bin\gcc-dw2.exe (gcc-dw2.exe -v 2>&1 | find "gcc version") if exist %MINGWBASEDIR%\bin\gdb.exe (gdb.exe -v | find "GNU gdb") if exist %MINGWBASEDIR%\bin\nasm.exe (nasm -v) if exist %MINGWBASEDIR%\bin\ld.exe (ld -v) if exist %MINGWBASEDIR%\bin\windres.exe (windres --version | find "GNU windres") if exist %MINGWBASEDIR%\bin\dlltool.exe (dlltool --version | find "GNU dlltool") if exist %MINGWBASEDIR%\bin\pexports.exe (pexports | find "PExports" ) if exist %MINGWBASEDIR%\bin\mingw32-make.exe (mingw32-make -v | find "GNU Make") if exist %MINGWBASEDIR%\bin\make.exe (ECHO It is not recommended to have make.exe in mingw/bin) REM ECHO "The minGW runtime version is the same as __MINGW32_VERSION" if exist "%MINGWBASEDIR%\include\_mingw.h" (type "%MINGWBASEDIR%\include\_mingw.h" | find "__MINGW32_VERSION" | find "#define") if exist "%MINGWBASEDIR%\include\w32api.h" (type "%MINGWBASEDIR%\include\w32api.h" | find "__W32API_VERSION") :_end PAUSE 

Solutions Collecting From Web of "C程序转换到Windows后显示%zu"

正如评论中链接的错误报告讨论所暗示的那样,微软的printf函数不支持C99。 如果宏__USE_MINGW_ANSI_STDIO在包含任何标题之前或在命令行上设置为1,则mingw-w64项目提供了可以用作正常C99函数的替代函数。 它们支持即使是最新的MSVCRT版本也不支持的标准%zu%jd等格式说明符。 你可以使用mingw_printf直接调用这个函数,但是把前面提到的宏定义为1并调用printf等等通常会更简单。

值得注意的是,如果你使用微软的snprintf ,如果缓冲区不够大,它将返回-1来指示截断,除非缓冲区和缓冲区大小参数分别为NULL和0,在这种情况下,字节数输出被返回。 C99行为总是返回缓冲区足够大时将输出的字节数,如果发生编码错误,则返回负值,并且mingw-w64实现似乎按照C99正确执行。

如果使用printf函数,或者只需-D__USE_MINGW_ANSI_STDIO=1添加到您的编译器调用中,您需要做的就是使所有这些标准行为都成为#define __USE_MINGW_ANSI_STDIO 1

如果您担心宏指令会干扰其他平台,除了提供类似功能的原始(传统?)MinGW [32]项目之外,没有其他实现实际上应该使用此预处理宏,因此无条件地定义它是安全的。