2012-03-31 136 views
1

雖然我閱讀有關文件list.hhlist FreeBSD的源代碼,我很困惑這個宏:無效的操作數爲二進制「|」

#define hlist_for_each_entry_safe(tp, p, n, head, field)  \ 
for (p = (head)->first; p ?     \ 
    (n = p->next) | (tp = hlist_entry(p, typeof(*tp), field)) : \ 
    NULL; p = n) 

,我試圖用類似的風格,我的功能如下:

int *a; 
int *b; 
int *c; 

if(a ? (b = (int *)0x0c) | (c = (int *)malloc(sizeof(int)) : NULL){ 

    printf("test\n"); 
} 

當我使用GCC編譯,編譯器給我的錯誤,他說:

invalid operands to binary "|" 

我寫我的FUNC因爲我認爲「for」循環的條件返回「true」或「false」,但實際上編譯器似乎告訴我他們不是一樣的。然後我不理解「爲「和」如果「。

PS:我的母語不是英語,也許你聽不懂,我很抱歉。

+5

你可以顯示你使用它的線嗎? – 2012-03-31 03:48:40

+2

你能告訴我們更多關於'n'和'tp'嗎?具體來說,他們的預期類型是什麼?或者,'hlist_for_each_entry_safe()'宏實際上是在代碼中的某處調用的?如果是這樣,那究竟是如何呢? – thb 2012-03-31 03:50:36

+2

這是一場災難。適用於其他人 - 請請不要對自己和任何其他人使用您的代碼執行此操作。 – littleadv 2012-03-31 05:30:22

回答

0

你不能用指針|。你必須使用整數類型。我不知道你引用的FreeBSD代碼,但他們可能使用uintptr_t

無論如何,littleadv是正確的。永遠不要這樣做。這是難以理解和不可維護的gobbledygook。

+0

我認爲這是一個關於「|」的錯誤寫法,也許他們想要「||」 – MYMNeo 2012-03-31 06:15:37

0

看起來像一些時髦的代碼 - |運算符只能用於整數,但該代碼看起來像它打算對指針進行操作。我只是猜測基於->next的語義,但如果這是一個指針字段,那麼這個代碼不會起作用,正如你所看到的。

相關問題