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

bol*_*ing 4 c macros enums

我有一个枚举,一个宏定义和一个所有使用枚举的方法.我无法编译.请考虑以下代码段.

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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

这编译,但我得到以下警告.

warning: pointer/integer type mismatch in conditional expression

warning: comparison between pointer and integer

为什么?我是C的新手,所以如果你能解释一些经验丰富的C开发人员看似显而易见的事情,我会很感激.我的大多数编程知识都是基于Java的.

Omr*_*rel 11

编译器试图找出程序中每个表达式的类型.

像这样的表达式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,以APPLE直接:

if (fruit == APPLE) { ... }
Run Code Online (Sandbox Code Playgroud)