- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
好的,我在 Windows 7 上使用 MinGW (GCC 4.6.2) 编译 C 文件时遇到了一个奇怪的问题。有问题的文件包含以下 C 代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%2hhX\n", 250);
char c[80];
snprintf(c, sizeof(c), "%2hhX", 250);
printf("%s\n", c);
return 0;
}
编译结果是这样的:
$ gcc.exe -std=c99 -pedantic -Wall test.c
test.c: In function 'main':
test.c:6:2: warning: unknown conversion type character 'h' in format [-Wformat]
test.c:6:2: warning: too many arguments for format [-Wformat-extra-args]
现在,令我感到奇怪的是,它提示第 6 行的 snprintf
调用,而不是第 4 行的 printf
调用。我是漏掉了什么还是警告不正确?此外,格式字符串 "%2hhX"
是否有更好的等价物? (我正在尝试将 char 变量打印为十六进制值。)
最佳答案
从历史上看,MinGW 的情况有点奇怪,尤其是在 C99 支持方面。 MinGW 主要依赖与 Windows 一起分发的 msvcrt.dll 运行时,并且该运行时不支持 C99。
因此,对于旧版本的 MinGW,在使用特定于 C99 的格式说明符时,您可能会在 C99 模式下遇到问题。同样在历史上,GCC 没有为 msvcrt.dll 缺乏对 C99 说明符的支持做出任何特殊调整。因此,您会遇到 -Wformat
不会就格式无效发出警告的情况。
双方都在改进 - GCC 在与 MS 运行时一起使用时对 -Wformat 具有特定支持,例如:
-Wpedantic-ms-format
这样 GCC 就不会提示 "I32"
和 "I64"
(即使它被记录在案,即使在 4.7.0 中我仍然收到关于它无法识别的投诉 - 也许它是全新的)__attribute__((__format__))
的 ms_printf
选项 另一方面,MinGW 已经提供了一段时间自己的 snprintf()
,因为 MSVC 的变体 _snprintf()
的行为完全不同。但是,MinGW 长期以来依赖于 msvcrt.dll 中的 printf()
,因此 printf()
的 C99 格式说明符不起作用。在某些时候,MinGW 开始提供它自己的 printf()
版本和 friend ,以便您可以获得适当的 C99(和 GNU?)支持。但是,似乎保守地说,这些最初并没有取代 msvcrt.dll 版本。它们的名称类似于 __mingw_printf()
。
看起来在 4.6.1 和 4.7.0 之间的某个时间点,MinGW header 开始使用 MinGW 提供的版本作为 msvcrt.dll 函数的替代品(至少如果您指定了 C99)。
不过,GCC 和 MinGW 似乎在更新的版本中还是有点不同步。和以前一样,GCC 不会警告实际上在 MinGW 上不起作用的说明符,它不会提示会起作用的说明符。
您可能想尝试以下代码片段以查看您的 MinGW 版本对 "hhX"
的支持程度:
printf("%hhX\n", 0x11223344);
__mingw_printf("%hhX\n", 0x11223344);
我不确定建议什么来解决您遇到的问题 - 我认为您可以修补 MinGW stdio.h
header ,使其具有 __attribute__((__format__ (gnu_printf, ...)))
printf 函数上的属性(它们不在较新的 stdio.h
中,因此 GCC 将使用它的默认想法格式支持是什么)。
关于c - MinGW 海湾合作委员会 : "Unknown conversion type character ' h'"(snprintf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10678124/
我已经开始使用 MinGW/MSYS 试图在 Windows 上使用一些 Linux 库。使用 ./configure --prefix=/mingw make make install 到目前为止运
Mingw.org显然还没有完全死掉,但最新的版本是 gcc 4.5.2,而 4.6 已经是老新闻了。 有谁知道我在哪里可以获得 mingw-gcc 4.6+?是 mingw-w64更活跃?他们似乎也
假设我有三个 C 源文件。前两个是 LIB(lib*.a?),第三个是使用它们的应用程序。 第一个是(re.c): int re(int i) { return i; } 第二个是(test.
MinGW、MinGW-w64和MinGW-builds有什么区别? 我应该使用哪一个在 Windows 8 机器上使用 Eclipse IDE 编译 c++ 11 源代码? 最佳答案 MinGW 是
至少从2021-01-10T15:19:40Z起,我无法访问www.mingw.org。 据我所知,这是mingw官方网页。 有人知道www.mingw.org的状态吗?或者,还有其他套房问这个问题吗
MinGW 有什么区别项目和 32-bit portion MinGW-w64的项目? MinGW-w64 的 32 位部分与 x64 有任何关系吗? 看起来他们的编译器做了完全相同的事情......
我想在 Windows 中有一个 POSIX 环境(用作系统 shell ),同时生成 native Windows 可执行文件。过去的一种选择是安装 Cygwin 和 MinGW,并可能从 Cygw
Qt 和 Code blocks 下载包都有自己的 MinGW 编译器。还有独立的 MinGW 本身。它们之间有什么区别吗? 我可以使用 Qt 的 MinGW 来构建代码块项目,反之亦然吗? 如果我想
我已经通过网络安装程序安装了 msysgit。我最终得到了将近 2 GB 的资料,其中包括 git 源和 MinGW。 我有三个问题 我已经从 MinGW.org 获得了 MinGW。现在我想我可以删
我终于设置了 mingw 和 msys,现在我想编译 libjpeg。我从 projekt 页面 (jpeg-8d) 下载了最新的 libjpeg 源并提取了文件。 然后我像这样运行配置命令: ./c
我喜欢 vcpkg 的想法,但我想我更愿意坚持使用 MinGW 作为我的编译器。 我找不到关于我是否可以设置(或如何设置)vcpkg 以便它为 MinGW 而不是 MSVC 编译包的任何资源。如果可能
我将在 Windows 中使用 NetCDF,我认为它必须使用 MinGW 编译,因为我的主程序和所有其他库已经使用 MinGW 编译。 但是当我使用 MinGW(gcc 版本 4.6.2)时。我收到
我正在尝试设置 MinGW。我已经下载了最新的安装程序,它安装了 mingw-get,但该实用程序无法获取软件包并提供以下类型的消息: mingw-get: * ERROR * Get package
我想使用 mingw-get-inst-20120421.exe 从 Sourceforge 下载 MinGW C 和 C++ gnu 编译器。它让我可以选择下载预先打包的存储库或最新的存储库。当我在
我刚刚按照 this post 设置了 MinGW 环境 但是如何向其中添加 3rd 方库? 最佳答案 库由两个主要组件组成——C 头文件和编译后的目标代码存档。 GCC 有一系列令人眼花缭乱的方法来
我不断收到错误: fatal error: mpi.h: No such file or directory 如何将 mpi.h 作为默认库包含在内?我相信我已经将 c:\MPICH2\bin 放在
看我有这样的代码 #include #include #include void* thread_function(void) { printf ("This is thread %d \n",p
如何使用 Mingw 在 Windows 中为源目录应用补丁文件? 最佳答案 使用mingw-get获取msys补丁 mingw-get install msys-patch 然后像unix一样使用p
我正在尝试使用来自 http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%
我刚刚在 Windows 上安装了 MinGW,但无法像在 Linux 甚至 PuTTY 上那样进行复制/粘贴。将文本(例如从 chrome)复制并粘贴到 MinGW shell 中的技巧是什么? 最
我是一名优秀的程序员,十分优秀!