是什么导致“警告:条件表达式中的指针/整数类型不匹配”?

2024-02-04

我有一个枚举、一个宏定义和一个都使用枚举的方法。我无法编译它。考虑以下代码片段。

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(使用前将#替换为@)

是什么导致“警告:条件表达式中的指针/整数类型不匹配”? 的相关文章

随机推荐