The implementation doesn't look too bad, but the usage is terrible:
#define E_LIST(X) \
X(V0) X(V1) X(V2) X(V3)
DEFINE_ENUM(E, E_LIST)
That's not how I want to declare my enums...To be honest there are ways to make that much nicer. I believe that if you use recursive macros using the VA_OPT feature, you should be able to provide enumerators directly to define enum as a list.
The underlying machinery implementation is going to be much uglier and complex, though.
In practice it is written like like this:
but one could also make it even more compact if one cared.