2012-03-31 168 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的语义,但如果这是一个指针字段,那么这个代码不会起作用,正如你所看到的。

相关问题