我不断收到编译警告,但我不知道如何修复:
'%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"才能运行该程序。