Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mingw printf尺寸规格字符h_C_Mingw_Printf_Gcc Warning_Format Specifiers - Fatal编程技术网

C mingw printf尺寸规格字符h

C mingw printf尺寸规格字符h,c,mingw,printf,gcc-warning,format-specifiers,C,Mingw,Printf,Gcc Warning,Format Specifiers,VisualStudio有一个声明,说我可以这样做,使用h前缀指定单字节字符串,而不考虑printf或wprintf: int main() { char test[]= "abc"; _tprintf(_T("%hs\n"),test); } 但是如果我使用mingw gcc和-Wall编译相同的东西,我会得到以下警告: 警告:格式“%hs”要求类型为“short int*”,但参数2的类型为“char*” 在mingw中指定一个单字节字符串是否可以接受 谢谢 编辑此问题已在下面详细回答。

VisualStudio有一个声明,说我可以这样做,使用h前缀指定单字节字符串,而不考虑printf或wprintf:

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

但是如果我使用mingw gcc和-Wall编译相同的东西,我会得到以下警告:
警告:格式“%hs”要求类型为“short int*”,但参数2的类型为“char*”

在mingw中指定一个单字节字符串是否可以接受

谢谢


编辑此问题已在下面详细回答。简短的回答是肯定的,在mingw中指定单字节字符串是可以接受的,警告可以忽略。

您还将注意到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文档用于格式字符串,因为MinGW将使用MS运行时。如果您不喜欢WalnGin生成,您可能需要考虑将<代码> -Wno格式< /Cord>选项添加到您的MIW构建脚本中。