无效的操作数到二进制“|”

时间:2012-03-31 03:44:40

标签: c

当我正在阅读文件hlist中有关list.h的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 "|"

我以这种方式编写我的函数,因为我认为“for”循环的条件返回“true”或“false”,但事实上编译器似乎告诉我它们不一样。然后我做不理解“for”和“if”之间的条件。

PS:我的母语不是英语,也许你听不懂,我很抱歉。

2 个答案:

答案 0 :(得分:0)

这看起来像一些时髦的代码 - |运算符只适用于整数,但该代码看起来像是打算对指针进行操作。我只是猜测基于->next的语义,但如果这是一个指针字段,那么这段代码就不会起作用了,正如你所见。

答案 1 :(得分:0)

你不能用指针|。你必须使用整数类型。我不知道您引用的FreeBSD代码,但他们可能会使用uintptr_t

无论如何,littleadv是对的。不要这样做。这是难以理解的,不可维护的gobbledygook。