gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:47:45 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 的建议, Microsoft 的 printf 函数不支持 C99。 mingw-w64 项目提供了替代函数,如果宏 __USE_MINGW_ANSI_STDIO 在包含任何 header 之前或在命令行上设置为 1,则这些函数可以像普通 C99 函数一样使用。它们支持标准的 %zu%jd 等格式说明符,即使是最新的 MSVCRT 版本也不支持。您可以使用 mingw_printf 直接调用该函数,但将上述宏定义为 1 并调用 printf 等通常更容易。

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

如果你使用任何 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/25670522/

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