GCC编译警告:格式'%i'需要类型'int *'的参数,但参数2的类型为'enum month *'[-Wformat]

时间:2012-02-15 20:28:31

标签: c gcc-warning

当我尝试编译代码时,我收到以下警告:

program141.c:13:5:警告:格式'%i'需要类型'int *'的参数,但参数2的类型为'enum month *'[-Wformat]

// Program to print the number of days in a month

#include <stdio.h>

int main (void)
{
    enum month { january = 1, february, march, april, may, june,
         july, august, september, october, november, december };
    enum month aMonth;
    int        days;

    printf ("Enter month number: ");
    scanf ("%i", &aMonth);

    switch (aMonth) {
    case january:
    case march:
    case may:
    case july:
    case august:
    case october:
    case december:
        days = 31;
        break;
    case april:
    case june:
    case september:
    case november:
        days = 30;
        break;
    case february:
        days = 28;
        break;
    default:
        printf ("bad month number\n");
        days = 0;
        break;
    }

    if ( days != 0 )
    printf ("Number of days is %i\n", days);

    if ( aMonth == february )
    printf ("...or 29 if it's a leap year\n");

    return 0;
}

这段代码来自我正在阅读的一本书。

如何修复此警告?

4 个答案:

答案 0 :(得分:4)

%i函数一起使用的scanf转换规范与指向有符号整数的指针匹配。在C中,枚举类型是与该类型兼容的实现定义的整数类型。

gcc中,如果枚举常量中存在负值,则枚举通常为unsigned int类型,类型为int

请参阅关于枚举的gcc实施定义文档(强调我的):

  

与每个枚举类型兼容的整数类型(C90 6.5.2.2,C99 6.7.2.2)。

     

通常,如果枚举中没有负值,则类型为 unsigned int ,否则为int。如果指定了-fshort-enums,那么如果有负值,则它是signed char的第一个,short和int可以表示所有值,否则它是unsigned char,unsigned short和unsigned int中的第一个,可以表示所有值价值。   在某些目标上,-shshort-enums是默认值;这是由ABI决定的。

来源http://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-and-bit_002dfields-implementation.html

要在系统上修复警告,只需使用与指向无符号整数类型的指针匹配的%u转换规范:

scanf ("%u", &aMonth);

答案 1 :(得分:2)

尝试:

scanf ("%u", &aMonth);

答案 2 :(得分:2)

输入int,而不是将其分配给enum month对象

int temp;
scanf("%d", &temp);
/* make sure 1 <= temp <= 12 */
aMonth = temp;

或者您可以尝试演员表,但这不安全( enumint的表示不必相同

scanf("%d", (int*)&aMonth);

注意:格式说明符"%i"接受十进制,十六进制和八进制表示法的值。

答案 3 :(得分:2)

特定枚举的基础类型不一定是int - 只要所有值都适合,实现就可以自由选择较小的类型(如果启用-fshort-enums,gcc将执行此操作)。

对于可移植解决方案,将aMonth设为int(只要您使用正确的转换说明符,任何其他整数类型都会执行)并根据需要转换为enum month