簡體   English   中英

將結構與 null 進行比較的操作數無效

[英]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 _kvint 將完全不同類型的對象相互比較是沒有意義的,因此這是非法的。

但更糟糕的是...... 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM