C 关于printf()长无符号int和uint32\t的编译器警告
在我的C代码中,我正在C 关于printf()长无符号int和uint32\t的编译器警告,c,linux,gcc,printf,C,Linux,Gcc,Printf,在我的C代码中,我正在fprintf输入一个%lu”,并为相应字段提供一个uint32\u t。但是,当我在GCC(4.2.4版)中使用-Wall编译时,我得到以下警告: writeresults.c:16: warning: format '%4lu' expects type 'long unsigned int', but argument 2 has type `uint32_t' 在32位体系结构上,uint32\t和long unsigned int不是一回事吗?如果不消除-Wa
fprintf
输入一个%lu”
,并为相应字段提供一个uint32\u t
。但是,当我在GCC(4.2.4版)中使用-Wall
编译时,我得到以下警告:
writeresults.c:16: warning: format '%4lu' expects type 'long unsigned int', but argument 2 has type
`uint32_t'
在32位体系结构上,uint32\t
和long unsigned int
不是一回事吗?如果不消除-Wall
编译器开关或使用类型转换(如果是,如何避免),是否可以避免此警告
是的,我仍然在使用32位计算机/arch/OS/compiler(目前太差了,买不起新的64位硬件)。谢谢在C++中,P>>“long int”和“int”是不同的类型。您可能正在寻找“u”格式,它代表“unsigned int”。当然,这取决于“uint32_t”在编译器上是什么类型的定义。
uint32_t
在带有GCC的x86 Linux上只是无符号int
。因此,请使用fprintf(stream,“%4u”,…)
(unsigned int)或更好的方法,fprintf(stream,“%4”PRIu32,…)
(用于uint32\t的inttypes.h
printf字符串说明符)
后者肯定会消除编译器警告/错误,而且是跨平台的。可靠抑制警告的最简单方法是使用强制转换:
printf( "%lu", ( unsigned long )x );
printf(“%lu”,(无符号长)x);
…这是完全可移植的,因为unsigned long
的最小允许大小正好足以容纳uint32\u t
类型的所有值。呃,您所指的“坏”类型转换在哪里PRIu32
是正确处理uint32\t
的定义。天哪,你说得对!我错了。谢谢我将删除我的评论。真正的问题:“在long==int的机器上,我如何让gcc不在{%d with long}上发出警告,因为出于某种原因(可能是MS compat),int32_t在机器上被定义为long而不是int,人们坚持在任何地方都使用int32_t,我真的不想放(int)在它们大小相同的情况下,编译器知道这一点,因此它可以知道(“%d”,(long)x)可以正常工作,但它警告您,因为该构造在其他机器上不起作用。当然,除非“long”实际上是一个int32_t typedef,在这种情况下,它将在int=32位的任何机器上工作。我更希望有一种方法来避免这种情况,并且只警告在当前情况下真正错误的事情。