gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:45:04 25 4
gpt4 key购买 nike

我通过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 样式转换说明符的情况下”。
这就是我撞到头的事情吗?

更新:
我的mingw版本是:

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

)

最佳答案

按照 bug report discussion linked in the comments 的建议,微软的printf函数不支持C99。 mingw-w64 项目提供了替代函数,如果在包含任何 header 之前或在命令行上将宏 __USE_MINGW_ANSI_STDIO 设置为 1,则可以像普通 C99 函数一样使用这些函数。它们支持标准 %zu%jd 等格式说明符,即使是最新的 MSVCRT 版本也不支持。您可以直接使用 mingw_printf 调用该函数,但通常将上述宏定义为 1 并调用 printf 等更容易。

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

如果您使用任何 printf 函数,要获得所有这些标准行为,您所需要做的就是在任何包含之前添加 #define __USE_MINGW_ANSI_STDIO 1 ,或者简单地添加-D__USE_MINGW_ANSI_STDIO=1 到您的编译器调用。

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

关于linux - C程序转换到Windows后显示%zu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44243880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com