Меня смущает определение функции ядра Linux. hlist_nulls_for_each_entry определяется как цикл for, и его легко понять.
#define hlist_nulls_for_each_entry(tpos, pos, head, member) \
for (pos = (head)->first; \
(!is_a_nulls(pos)) && \
({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1;}); \
pos = pos->next)
Хотя я не могу понять следующее предложение, почему автор добавляет ; 1; до конца. Почему бы не переместить предложение tpos = hlist_nulls_entry(pos, typeof(*tpos), member) в следующее из pos = pos->next .
({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1;});