There's nothing "C99" about that ARRAY_SIZE macro, of course.
That said, I'm rather sceptical towards it, I think it's better written as-is.
Otherwise, the question "does SIZE mean bytes, or number of elements?" always arises to haunt me. Once you need to keep looking stuff like that up, the macro isn't helping.
In actual code, the name of the array never needs to be enclosed in parentheses so it's often clearer too. E.g. something like:
int fourk[4096];
for(size_t i = 0; i < sizeof fourk / sizeof *fourk; ++i)
...
I realize that it's not 100% DRY to repeat the array name, but I think it's a small price to pay for not having to use a non-standard macro that requires learning. It's all about friction.