源码来自 newlib-cygwin
其中有以下一段宏:
#define SLIST_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = SLIST_FIRST((head)); \
(var) && ((tvar) = SLIST_NEXT((var), field), 1); \
(var) = (tvar))
其目的是通过这个宏实现安全遍历链表,可以在遍历的时候删除链表元素。其中 for 循环中的表达式 2 中的目的是当 var 非空的时候就执行后面的赋值 tvar ,若 var 为空执行后面的 SLIST_NEXT 会导致崩溃。我对这里就很不解了,首先这个表达式我没见过,后面一个 1 是什么操作?其次在遍历到最后一个元素的时候 tvar 必然会等于空而跳出循环,但是实际运行得很好。