当我正在阅读文件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:我的母语不是英语,也许你听不懂,我很抱歉。答案 0 :(得分:0)
这看起来像一些时髦的代码 - |
运算符只适用于整数,但该代码看起来像是打算对指针进行操作。我只是猜测基于->next
的语义,但如果这是一个指针字段,那么这段代码就不会起作用了,正如你所见。
答案 1 :(得分:0)
你不能用指针|
。你必须使用整数类型。我不知道您引用的FreeBSD代码,但他们可能会使用uintptr_t
。
无论如何,littleadv
是对的。不要这样做。这是难以理解的,不可维护的gobbledygook。