当我尝试编译代码时,我收到以下警告:
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;
}
这段代码来自我正在阅读的一本书。
如何修复此警告?
答案 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决定的。
要在系统上修复警告,只需使用与指向无符号整数类型的指针匹配的%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;
或者您可以尝试演员表,但这不安全( enum
和int
的表示不必相同)
scanf("%d", (int*)&aMonth);
注意:格式说明符"%i"
接受十进制,十六进制和八进制表示法的值。
答案 3 :(得分:2)
特定枚举的基础类型不一定是int
- 只要所有值都适合,实现就可以自由选择较小的类型(如果启用-fshort-enums
,gcc将执行此操作)。
对于可移植解决方案,将aMonth
设为int
(只要您使用正确的转换说明符,任何其他整数类型都会执行)并根据需要转换为enum month
。