0

我正在尝试调试代码中的以下错误:

#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.

我在这里做错了什么?我认为我可以使用 apatterns[idx] == NULL来测试何时可以退出循环(因为我将数组初始化为全零),但我似乎在某些事情上错了。我应该检查一下patterns[idx].key是否是这样NULL吗?

我想检查整个结构是否为零的一种(丑陋)方法是:

printf ("Null? %s\n", 
(int) (void*) patterns[0].key + (int) (void*) patterns[0].val == 0? "true" : "false");
4

2 回答 2

1

好吧,错误消息说明了一切......您正在尝试比较 astruct _kv和 an int。将完全不同类型的对象相互比较是没有意义的,因此这是非法的。

但更糟糕的是...... C 不允许您使用==Not 比较结构,即使这些结构属于同一类型。例子:

    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

如果您的程序比较代码中的多个位置的结构,则编写专用的比较函数可能是个好主意 - 例如:

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");
于 2021-04-11T06:36:32.317 回答
-3

以我谦虚的观点,我完全同意凯勒姆的观点。"item" 的数据类型是结构,不能直接与整数类型变量或字面整数进行比较。相反,在 C++ 中,我们可以使用运算符重载来为自定义数据类型(例如任何自定义类或结构)重新定义“==”运算符。

于 2021-04-11T05:47:32.643 回答