2011-02-10 361 views
4

在我的C代码中,我是fprintf ing "%lu"并给出了相应字段的uint32_t。但是,当我与-Wall编译GCC,我得到以下警告(版本4.2.4):关于printf()的编译器警告long unsigned int和uint32_t

writeresults.c:16: warning: format '%4lu' expects type 'long unsigned int', but argument 2 has type 
`uint32_t' 

不是uint32_tlong unsigned int在32位架构是一回事吗?如果不删除-Wall编译器开关或使用类型转换(如果是,如何),可以避免此警告吗?

是的,我仍然在使用32位计算机/ arch/OS /编译器(目前太穷而无法购买新的64位硬件)。谢谢!

+0

真正的问题:“我如何获得GCC到*不*警告在{%长d},在一些机器上长= = int,因为出于某种原因(可能是MS compat),int32_t在机器上被定义为long而不是int,并且人们坚持要在任何地方使用int32_t,而且我真的不想把(int)放在每个单一的东西传递给printf“。 – greggo 2017-09-20 18:38:18

回答

9

uint32_t x86上的Linux与GCC只是unsigned int。因此,使用fprintf(stream, "%4u", ...)(无符号整型)或更好,fprintf(stream, "%4" PRIu32, ...)(的inttypes.h printf字符串说明符)。

后者肯定会消除编译器警告/错误,另外还是跨平台的。

+0

呃,你指的是什么“不好”的角色? `PRIu32` *是正确处理`uint32_t`的定义。 – 2011-03-17 22:50:48

+0

哦,我是,你是对的!我错了。谢谢。我会删除我的评论。 – vy32 2011-03-18 04:40:11

1

“long int”和“int”在C++中是不同的类型。您可能正在寻找“u”格式,即“unsigned int”。当然,这取决于什么“uint32_t”是你的编译器的typedef。

+0

在它们大小相同的情况下,编译器意识到这一点,因此它可以知道(“%d”,(long)x)将正常工作,但它会警告您,因为该构造不会在其他机器。当然,除非'long'确实是int32_t typedef,在这种情况下,它可以在int = 32位的任何机器上工作。我更喜欢是否有办法解决这个问题,并且只会警告在当前情况下真*错的事情。 – greggo 2017-09-20 18:45:00

4

可靠地抑制警告的最简单的方法是用铸造:

 
printf("%lu", (unsigned long)x);