当前位置: 首页 > 面试题库 >

转换为Windows后,C程序显示%zu

詹钊
2023-03-14
问题内容

我通过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


问题答案:

正如注释中的错误报告讨论所建议的那样,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_STDIO 1在使用任何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.



 类似资料:
  • 问题内容: 是否可以将Python程序转换为C / C ++? 我需要实现一些算法,而且我不确定性能差距是否足够大,足以证明我在C / C 中做的所有痛苦(我不擅长)。我考虑过要编写一种简单的算法,并针对这种转换后的解决方案进行基准测试。如果仅此一项比Python版本要快得多,那么除了在C / C 中做到这一点,我别无选择。 问题答案: 是。看看赛顿。它就是这样做的:将Python转换为C以加快速

  • 问题内容: 我编写了一个程序,可通过深度优先搜索解决迷宫问题。我想知道如何将该Java程序转换为Screensaver应用程序?通常可以激活屏幕保护程序时,Windows 7是否可以启动我的应用程序? 问题答案: Windows屏幕保护程序只是接受某些命令行参数的程序。因此,为了使您的程序可以作为屏幕保护程序运行,您必须对其进行编码以接受这些参数。 接下来,您可能希望屏幕保护程序以全屏模式运行。这

  • 我有一个MFC应用程序。在我的应用程序中,如果我在Windows XP上运行,它工作正常。但如果我在Windows Vista中运行,MFC对话框会隐藏在任务栏后面。 我使用了这个代码,但它隐藏了任务栏。但我想在任务栏上方显示应用程序。

  • 问题内容: 我正在寻找一种无需使用py2exe将Python程序转换为.exe文件的方法。py2exe说它需要Python 2.6,它已经过时了。有没有办法使最终用户不必安装Python就可以分发我的Python程序? 问题答案: 请理解,每个用于Python的“冻结”应用程序都不会以任何方式真正保护您的代码。每个用于独立可执行Python“程序”的打包系统都将包含许多Python库和解释器,这将

  • 我没有得到正确的输出为这个程序得到abcde-*给输入在主 这个程序是将表达式从中缀转换为后缀这里是算法 算法1。从左到右扫描中缀表达式。 如果扫描的字符是操作数,则将其输出。 否则, ......3.1如果扫描的运算符的优先级大于堆栈中运算符的优先级(或者堆栈是空的),则推送它。...... 3.2否则,从堆栈中弹出操作符,直到被扫描操作符的优先级小于-等于位于堆栈顶部的操作符的优先级。将扫描的

  • 我得到了这段代码,我必须选择正确的答案。 现在: a)y值升为幂 b)x所在单元的地址 c)可变单元地址y d)值5 当我在程序中输入它时,我只是弹出,但我不知道那是不是正确的答案。