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

时间:2014-01-15 02:33:35

标签: c compilation printf sizeof

我一直收到编译警告,但我不知道如何解决它:

'%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 bytes\n", 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 bytes\n",
            sizeof( unsigned long long ));
    printf("\nfloat is %d bytes", sizeof( float ));
    printf("\nA double is %d bytes\n", sizeof( double ));
    printf("\nA long double is %d bytes\n", sizeof( long double ));

    return 0;

}

3 个答案:

答案 0 :(得分:26)

sizeof返回size_t您需要使用%zu作为格式字符串而不是%dsize_t无符号整数的类型可能会有所不同(取决于平台),并且可能不是 long unsigned int ,这在草案C99标准部分中有所涉及6.5.3.4 sizeof运算符 4

  

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

另请注意,使用printf的错误格式说明符是未定义的行为,7.19.6.1 fprintf函数部分对此进行了介绍,其中也涵盖了printf关于格式说明符说:

  

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

更新

Visual Studio does not support the z format specifier

  

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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