MinGW GCC:“未知转换类型字符'h'”(snprintf)

2024-03-05

好的,我在 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]

现在,对我来说奇怪的是它抱怨snprintf拨打 6 号线,但不拨打printf请致电第 4 行。我是否遗漏了什么,或者警告是否不正确?另外,格式字符串是否有更好的等效项"%2hhX"? (我正在尝试将 char 变量打印为十六进制值。)


从历史上看,MinGW 的处境有点奇怪,尤其是就 C99 支持而言。 MinGW 主要依赖于随 Windows 一起分发的 msvcrt.dll 运行时,并且该运行时不支持 C99。

因此,对于旧版本的 MinGW,当使用 C99 特定的格式说明符时,您可能会在 C99 模式下遇到问题。同样从历史上看,GCC 并没有针对 msvcrt.dll 缺乏对 C99 说明符的支持做出任何特殊调整。所以你会遇到这样的情况-Wformat不会警告无法使用的格式。

双方的情况都在改善 - 当与 MS 运行时一起使用时,GCC 对 -Wformat 提供了特定支持,例如:

  • -Wpedantic-ms-format这样海湾合作委员会就不会抱怨"I32" and "I64"(尽管它已被记录,但我仍然收到关于它无法识别的抱怨,即使在 4.7.0 中 - 也许它是全新的)
  • the ms_printf选项__attribute__((__format__))

另一方面,MinGW 提供了自己的snprintf()有一段时间,自从MSVC的变种以来,_snprintf(),行为完全不同。然而,MinGW 长期以来依赖于printf()在 msvcrt.dll 中,因此 C99 格式说明符为printf()没用。在某个时候,MinGW 开始提供它自己的版本printf()和朋友,以便您可以获得适当的 C99(和 GNU?)支持。然而,从保守的角度来看,这些版本最初并没有取代 msvcrt.dll 版本。他们的名字像__mingw_printf().

看起来在 4.6.1 和 4.7.0 之间的某个时刻,MinGW 标头开始使用 MinGW 提供的版本作为 msvcrt.dll 函数的替代品(至少如果您指定了 C99)。

不过,似乎在新版本中,GCC 和 MinGW 还是有点不同步。与以前一样,GCC 不会警告那些实际上无法在 MinGW 上运行的说明符,但它不会抱怨能够在 MinGW 上运行的说明符。

您可能需要尝试以下代码片段来查看您的 MinGW 版本的支持情况"hhX":

printf("%hhX\n", 0x11223344);
__mingw_printf("%hhX\n", 0x11223344);

我不确定如何建议来解决您遇到的问题 - 我认为您可以修补 MinGWstdio.h标头,使其具有__attribute__((__format__ (gnu_printf, ...)))printf 函数上的属性(它们在较新的版本中不存在)stdio.h,因此 GCC 将使用其默认的格式支持概念)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MinGW GCC:“未知转换类型字符'h'”(snprintf) 的相关文章

  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • C free() 是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 malloc 和 free 如何工作 https stackoverflow com questions 1119134 how malloc and free work include
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 为什么不能调用带有 auto& 参数的 const mutable lambda?

    include
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 如何在 GCC C++ 中编写多行内联汇编代码?

    这看起来不太友好 asm command 1 command 2 command 3 我真的必须在每一行加上双引号吗 另外 由于多行字符串文字在 GCC 中不起作用 我也无法欺骗它 我总是在互联网上找到一些例子 该人手动插入制表符和换行符而

随机推荐

  • Rails 后台进程的进度条

    我的 Rails 应用程序中有几个进程调用外部 Web API 并且需要很长时间才能完成 我考虑过将它们移至后台处理 我希望能够向用户显示后台进程的进度 即进度条 首先 是否有关于在 Rails 中使用 jQuery 实现进度条 与文件上传
  • 为什么 Docker 容器镜像这么大? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我通过 Fedora 的 Dockerfile 制作了一个简单的镜像 最初 320 MB 添加了Nano 这个1MB大小的微型编辑器
  • Mercurial(我猜还有 Git)与 Dropbox:有什么缺点吗?

    我有一个用于个人项目的 Mercurial 存储库 并且我已经将主存储库存储在我的 Dropbox 中几周了 沿着这条线 http iamthewalr us blog 2009 02 mercurial and dropbox 我明白这也
  • 如何同时发出多个axios请求?

    此时我有一个网页 其中正在发出一长串 Axios POST 调用 现在 请求似乎是并行发送的 JavaScript 在收到结果之前继续发送下一个请求 然而 结果似乎是一一返回的 而不是同时返回的 假设对 PHP 脚本的一次 POST 调用需
  • 如何将浮动操作按钮集成到带有工具栏的线性布局中

    我有以下列表视图 我想向其中添加浮动操作按钮
  • NSWindow 到底什么时候会变成圆角?

    我发现了几个类似的问题 但没有完全相同的问题 有些比有问题的操作系统更旧 有些正在做疯狂的事情 比如完全自定义窗口 我发现没有人提供有关如何使完全普通的窗口正常工作的说明 从 OS X Lion 开始 标准窗口都有圆角 不幸的是 我在我的应
  • 异常:未找到 Jupyter 命令 `jupyter-notebook`,Windows

    因此 在安装 VSCode 和 Python 3 7 4 64 位 之后 我真的很难让 python 交互式 工作 我已经在 VScode 中安装了 Python 扩展jupyter and jupyter lab但我不断收到错误 异常 J
  • PyCharm 社区版中的 中出现意外标记

    我是 PyCharm 的新手 但我逐渐喜欢上了它 我的屏幕上出现红色下划线错误是 意外的令牌 为什么 PyCharm 会显示它 我无法理解 当您没有在 Pycharm 的设置中启用 Django 时 通常会发生这种情况 要解决该问题 在 P
  • ASP.Net:在编辑和删除时从 GridView 获取 DataKey

    我正在使用一个GridView控件数据绑定到List从实用程序方法返回的对象的数量 这GridView控件将其中一列设置为其 DataKey 当一行是Selected 它会触发 Selected 事件处理程序 我可以使用myGridView
  • javascript 检测桌面触摸和鼠标支持

    触控设备应如何区分纯触控设备和带有鼠标的设备 就像今天的一些笔记本电脑 需要在应用程序中给予所有鼠标功能优先级 并且如果运行应用程序的设备仅支持触摸 则需要更改功能 如果触摸设备也有鼠标指针 逻辑建议应用程序应将该设备视为普通桌面 并且也可
  • array.map() 中花括号的含义[重复]

    这个问题在这里已经有答案了 我有一个 map 改变的函数isActive对象的属性值data大批 然而 用大括号包裹它会返回未定义的结果 而用括号包裹它或不包裹它会返回更新后的值 大括号用作箭头函数中的包装器 但它对于 map 的工作方式是
  • zod TypeError:无法读取未定义的属性(读取“_parse”)

    我有一个使用 Zod 的 Vite 库 我想解析配置 我的文件夹结构与配置对象结构类似 index ts文件始终导出其自己目录中的所有文件及其子目录中的所有内容 例如export from subDir 所以根文件导出 整个库 以下设置显示
  • 批处理文件将部分文件名移动到部分文件夹名称字符串

    我有一个充满文件夹的目录 这些文件夹以这种方式命名 ABC L2 0001 2ABC12345 0101 xxxx 我需要将许多以此方式命名的文件移动到与文件的前 9 个字符匹配的文件夹中 2ABC12345 0101 xyxyxyx yx
  • 如何在 MSBuild 中并行运行任务

    除非我严重误解了 MSBuild 否则任务将按照它们在 目标 节点中出现的文档顺序执行 我希望能够指定两个任务 例如 xcopy 任务 可以并行运行 我期待有一个 并行 任务或其他任务 尝试 MSBuild 扩展包中的新并行任务 http
  • 使用 .htaccess 更改 url 中的目录

    我正在尝试更改地址栏中显示的网址mysite com blog wedding hair to mysite com services wedding hair using htaccess 使用以下答案 https stackoverfl
  • 带负值和高度的 CSS 相对定位

    我试图对 DIV 元素进行负向定位 在示例中是 content 但我的问题是 div 的容器 wrapper2 获得了太多高度 实际上是 content 给出的高度 但正如我 我将内容向上移动 我想相应地降低 wrapper2 的高度 在这
  • 删除 MVC 中的浏览器自动完成功能

    我目前正在尝试删除用户浏览器完成的表单自动完成功能 这可能会导致一些关键行为 因为它填充了密码字段 我已经将自动完成属性添加到我的所有文本框字段中 但是当我尝试使用 Firefox 时 它仍然会将我当前的登录信息加载到字段中 有谁知道如何解
  • JScrollPane 未添加到 JTextArea

    我看到了几个类似这个问题的问题 但我无法解决这个问题 我无法得到JScrollPane可见于JTextArea 谁能指出我哪里做错了 谢谢 package experiement import java awt Dimension impo
  • openlayers 策略:ol.loadingstrategy.bbox 不适用于 wfs 功能

    我尝试使用此代码使用 openlayers 4 最大 1000 可视化 wfs 中的地块 但是视图地图的每次移动或缩放时范围不会改变 或者新功能不会加载到图层中 var parcellaireSource new ol source Vec
  • MinGW GCC:“未知转换类型字符'h'”(snprintf)

    好的 我在 Windows 7 上使用 MinGW GCC 4 6 2 编译 C 文件时遇到了一个奇怪的问题 该文件包含以下 C 代码 include