![](/img/trans.png)
[英]why comparing null function pointer results in “invalid operands to binary ==”
[英]Invalid operands comparing a struct to null
我正在尝试调试代码中的以下错误:
#define MAX_PATTERNS 10
typedef struct _kv {
char* key;
char* val;
} KV;
void compile(char* pattern)
{
KV patterns[MAX_PATTERNS] = {NULL,};
for (int idx=0; idx < MAX_PATTERNS; idx++) {
KV item = patterns[idx];
printf("%d", item == 0);
}
}
我收到以下错误:
test.c:107:27: error: invalid operands to binary expression ('KV' (aka 'struct _kv') and 'int')
printf("%d", item == 0);
~~~~ ^ ~
error generated.
我在这里做错了什么? 我认为我可以使用patterns[idx] == NULL
来测试我何时可以退出循环(因为我将数组初始化为全零),但我似乎在某些方面是错误的。 我应该检查patterns[idx].key
以查看是否是NULL
吗?
我想检查整个结构是否为零的一种(丑陋)方法是:
printf ("Null? %s\n",
(int) (void*) patterns[0].key + (int) (void*) patterns[0].val == 0? "true" : "false");
好吧,错误消息说明了一切……您正在尝试比较struct _kv
和int
。 将完全不同类型的对象相互比较是没有意义的,因此这是非法的。
但更糟糕的是...... C 不允许您使用==
比较结构,即使结构属于同一类型。 例子:
KV item1 = patterns[idx1];
KV item2 = patterns[idx2];
if (item1 == item2) puts("e");
将给出如下错误:
error: invalid operands to binary == (have ‘KV’ {aka ‘struct _kv’} and ‘KV’ {aka ‘struct _kv’})
要比较结构,您需要一一比较成员。
你问它是否像这样完成:
(int) (void*) patterns[0].key + (int) (void*) patterns[0].val == 0
答案是否定的
而是做
patterns[0].key == NULL && patterns[0].val == NULL
如果您的程序比较代码中的多个位置的结构,最好编写一个专门的比较 function - 例如:
int equal_kv(const KV* a, const KV* b)
{
return a->key == b->key && a->val == b->val;
}
并像这样使用它:
KV item1 = patterns[idx1];
KV item2 = patterns[idx2];
if equal_kv(&item1, &item2) puts("e");
以我谦虚的观点,我完全同意凯勒姆的观点。 "item" 的数据类型是结构,不能直接与 integer 类型变量或字面量 integer 进行比较。 相反,在 C++ 中,我们可以使用运算符重载来为自定义数据类型(例如任何自定义 class 或结构)重新定义“==”运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.