2 ms·
A bit cleaner setup, in my opinion, makes the "x macro" an argument to the user-defined macro, rather than depending on #include. For example, to define an enu
by comex 11y ago
A bit cleaner setup, in my opinion, makes the "x macro" an argument to the user-defined macro, rather than depending on #include. For example, to define an enum along with a string representation function for it:
#define DEFINE_ENUM(name, variants) \
enum name { \
variants(DEFINE_ENUM_VARIANT_ITSELF) \
}; \
const char *repr_##name(enum name e) { \
switch (e) { \
variants(DEFINE_ENUM_VARIANT_REPR_CASE) \
default: return "?"; \
} \
}
#define DEFINE_ENUM_VARIANT_ITSELF(variant) variant,
#define DEFINE_ENUM_VARIANT_REPR_CASE(variant) \
case variant: return #variant;
// client code:
#define foo_variants(x) \
x(FOO_1) \
x(FOO_2)
DEFINE_ENUM(foo, foo_variants)