【问题标题】:mingw printf size specification character hmingw printf 大小规格字符 h
【发布时间】:2011-07-18 05:43:39
【问题描述】:

Visual Studio 有一个 size and distance specification chart 说我可以做这样的事情,使用 h 前缀来指定单字节字符串,而不管 printf 或 wprintf:

int main()
{
char test[]= "abc";
_tprintf(_T("%hs\n"),test);
}


但如果我用 mingw gcc 和 -Wall 编译相同的东西,我会收到以下警告:
warning: format '%hs' expects type 'short int *', but argument 2 has type 'char *'

在 mingw 中指定单字节字符串的方法是可接受的吗?

谢谢

编辑-这个问题已经在下面得到了相当详细的回答。简短的回答是肯定的,在 mingw 中指定单字节字符串是一种可接受的方式,并且可以忽略警告。

【问题讨论】:

    标签: c mingw printf gcc-warning format-specifiers


    【解决方案1】:

    您还会注意到 Visual Studio 文档说:

    注意:h 和 l 前缀在与 char 类型的数据一起使用时是 Microsoft 扩展。

    我认为这会更准确地说,“当与'c''s' 格式说明符(大写或小写)一起使用时”。

    意识到 GCC 编译器确实不知道 Microsoft 的运行时如何处理 printf() 格式字符串,并且 GCC 给出的警告是针对它更通常使用的运行时量身定制的。使用 MinGW 构建时,会使用随 Windows 提供的 Microsoft C 运行时msvcrt.dll(尽管 MinGW 确实为某些库函数提供了替换或包装器)。因此,有时编译器认为printf() 格式字符串可以接受的内容与提供给printf() 的参数以及运行时实际执行的操作之间存在混淆。

    例如,直到最近,使用 ll 进行整数转换以格式化 64 位 int 类型在 MinGW 中无法正常工作。我不确定是否在 MinGW 支持函数中发生了“修复”,或者是否更新了 msvcrt.dll 以支持 ll 修饰符(我怀疑 msvcrt.dll 已更新 - 我必须检查.. .).

    无论如何,这归结为无论 GCC 对printf() 格式字符串发出的警告如何,您很可能都需要将 MSVC 文档用于格式字符串,因为它是 MinGW 的 MS 运行时将使用。如果您不喜欢生成的警告,您可能需要考虑将 -Wno-format 选项添加到您的 MinGW 构建脚本中。

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 2011-04-28
      • 1970-01-01
      • 2013-08-19
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      相关资源
      最近更新 更多