我有一个枚举,一个宏定义和一个所有使用枚举的方法.我无法编译.请考虑以下代码段.
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)
| 归档时间: |
|
| 查看次数: |
7003 次 |
| 最近记录: |