Hm, in the linked page there is a typedef long for I.
typedef long I;
#define DO(n,x) {I i=0,_n=(n);for(;i<_n;++i){x;}}
(I added a comma here after the }, 20 is the x parameters)
DO({i+= 10;}, 20);
expands to:
typedef long I;
{I i=0,_n=({i+= 10;});for(;i<_n;++i){20;}};
The '20' presumably should have been some kind of function call or action to repeat and the 'n' should have been the count (the reverse from your example).
So that would make this:
typedef long I;
{I i=0,_n=(20);for(;i<_n;++i){ i+= 10; }};
You're still right that it will shadow any 'i' declared outside and so it won't work but it will not overwrite it as far as I can see. You'll just end up right where you started.
What I really don't get is if they're going to use _n for the count anyway why not count it down to 0, that way the whole 'i' could be avoided.
(you'd still have a problem with _n but that could be overcome with a convention, which of course someone will forget with some nasty bug as a result)