我有一个枚举、一个宏定义和一个都使用枚举的方法。我无法编译它。考虑以下代码片段。
typedef enum fruits_t
{
APPLE,
ORANGE,
BANANA
} fruits_t;
#define KEY_TO_VALUE(x) ((x == APPLE) ? 0 : \
(x == ORANGE) ? 1 : \
(x == BANANA) ? 2 : \
"Undefined")
static void foo(char fruit) {
if (fruit == KEY_TO_VALUE(APPLE)) {
/* do something */
}
}
这可以编译,但我收到以下警告。
warning: pointer/integer type mismatch in conditional expression
warning: comparison between pointer and integer
为什么?我对 C 非常陌生,所以如果您能解释对经验丰富的 C 开发人员来说似乎显而易见的事情,我将不胜感激。我的大部分编程知识都是基于 Java 的。
编译器试图找出程序中每个表达式的类型。
诸如此类的表达式x > 0 ? 5 : "no"
让编译器摸不着头脑。如果 x 大于零,则类型为int
,但如果不是,则类型为const char *
。这是一个问题,因为没有从指针到int
(反之亦然)。所以编译器会对此发出警告。
解决方案是确保无论值是多少fruit
是,值KEY_TO_VALUE
有单一类型。例如,而不是“未定义”(其类型为const char *
,因为它是一个文字字符串),您可以使用特殊值,例如 -1。
另外,请注意APPLE
是一个值为 0 的常数,ORANGE
是一个值为 1 的常数,并且BANANA
是一个值为 2 的常量(这就是enum
作品)。所以你不需要KEY_TO_VALUE
,因为常数已经具有所需的值。你可以简单比较一下fruit
to APPLE
直接地:
if (fruit == APPLE) { ... }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)