Просто примите некоторые реальные значения для i и s, чтобы увидеть, что он делает:
std::list<int> list;
FOREACH(i, list)
Это разрешится в макросе FOREACH(i, list)
:
for(VAR(i, (list).begin()); i != (list).end(); i++)
Теперь разрешите макрос VAR(i, (list).begin())
:
__typeof((list).begin()) i = (list).begin();
Где __typeof получает тип аргумента (list).begin()
, который в данном случае std::list<int>::iterator
std::list<int>::iterator i = (list).begin();
Теперь вставьте это в for и получите:
for(std:list<int>::iterator i = (list).begin(); i != (list).end(); i++)
Как вы видите, часть __typeof является не типом, а декларацией, поэтому парантез там неправильный.
Также обратите внимание на множество комментариев о том, почему бы не использовать макросы и __typeof в специальных!