> I am hoping that this last one is not allowed and we can use the > "same condition is checked every time we loop" version that hides > the uglyness inside the macro. By which you are referring to Jonathans solution posted. Maybe we can combine the two solutions (checking for thelist to not be NULL once, by Jonathan) and using an outer structure (SZEDERs solution) by replacing the condition by a for loop, roughly (untested): #define for_each_string_list_item(item,list) \ - for (item = (list)->items; item < (list)->items + (list)->nr; ++item) + for (; list; list = NULL) + for (item = (list)->items; item < (list)->items + (list)->nr; ++item) as that would not mingle with any dangling else clause. It is also just one statement, such that if (bla) for_each_string_list_item { baz(item); } else foo; still works. Are there downsides to this combined approach?