C 关于printf()长无符号int和uint32\t的编译器警告

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

在我的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
不是一回事吗?如果不消除
-Wall
编译器开关或使用类型转换(如果是,如何避免),是否可以避免此警告


是的,我仍然在使用32位计算机/arch/OS/compiler(目前太差了,买不起新的64位硬件)。谢谢>“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位的任何机器上工作。我更希望有一种方法来避免这种情况,并且只警告在当前情况下真正错误的事情。