c语言 - '%d' 需要类型为 'int' 的参数,但参数 2 的类型为 'long unsigned int' [-Wformat=]



我不断收到编译警告,但我不知道如何修复:

'%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [

程序运行良好,但我仍然收到编译警告:

/* Sizeof.c--Program to tell byte size of the C variable */
#include <stdio.h>
int main(void) {
printf("nA Char is %d bytes", sizeof( char ));
printf("nAn int is %d bytes", sizeof( int ));
printf("nA short is %d bytes", sizeof( short ));
printf("nA long is %d bytes", sizeof( long ));
printf("nA long long is %d bytesn", sizeof( long long ));
printf("nAn unsigned Char is %d bytes", sizeof( unsigned char ));
printf("nAn unsigned int is %d bytes", sizeof( unsigned int));
printf("nAn unsigned short is %d bytes", sizeof( unsigned short ));
printf("nAn unsigned long is %d bytes", sizeof( unsigned long ));
printf("nAn unsigned long long is %d bytesn",
sizeof( unsigned long long ));
printf("nfloat is %d bytes", sizeof( float ));
printf("nA double is %d bytesn", sizeof( double ));
printf("nA long double is %d bytesn", sizeof( long double ));
return 0;
}

sizeof返回size_t您需要使用%zu而不是%d作为格式字符串。size_t无符号整数的类型可能会有所不同(取决于平台),并且可能不是处处都是长无符号int,这在C99标准草案6.5.3.4中有所介绍。运算符段落4

结果的值由实现定义,其类型(无符号整数类型)是size_t,在(和其他标头)中定义。

还要注意,为printf使用错误的格式说明符是未定义的行为,这在7.19.6.1一节中有介绍。fprintf函数也涵盖了printf的格式说明符,它说:

如果转换规范无效,则行为未定义248)如果任何参数不是相应转换规范的正确类型,则行为是未定义的。

更新

Visual Studio不支持z格式说明符:

hh、j、z和t长度前缀不受支持。

在这种情况下,正确的格式说明符应该是%Iu

编译器警告您可能会丢失精度。也就是说,用于打印sizeof%d的格式说明符无法打印size_t的全部范围。将%d更改为%zu,您的警告将消失。

我在Linux中也遇到了同样的问题。相同的程序在windows中运行时没有错误(意味着"%d"工作时没有错误),但对于linux,我必须用"%lu"替换所有的"%d"才能运行该程序。

相关内容

最新更新