mingw printf尺寸规格字符h

时间:2011-07-18 05:43:40

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

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中指定单字节字符串的可接受方式,并且可以忽略警告。

1 个答案:

答案 0 :(得分:2)

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

  

注意:与char类型的数据一起使用时,h和l前缀是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文档用于格式字符串,因为它是MS运行时MinGW将使用。如果您不喜欢生成warngin,可能需要考虑在MinGW构建脚本中添加-Wno-format选项。