1

Visual Studio 有一个大小和距离规范图表,说明我可以做这样的事情,使用 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 中指定单字节字符串的可接受方式,并且可以忽略警告。

4

1 回答 1

2

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

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

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

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

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

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

于 2011-07-18T06:47:46.573 回答