Something that you might or might not want to do, first define what is to be defined, in this case enums and char arrays:
#define DEFENUM(v) v,
#define DEFENUM_last(v) v
#define DEFINE_ENUM(n, LIST) enum n { LIST(DEFENUM) }
#define DEFARR(v) #v,
#define DEFARR_last(v) #v
#define DEFINE_ARRAY(n, LIST) const char *n[] = { LIST(DEFARR) }
Then make your list with this format:
#define LETTERS(GEN) \
GEN(aaa) \
GEN(bbb) \
GEN(ccc) \
GEN(ffffd) \
GEN##_last(eee)
Or this one:
#define LETTERS(GEN) \
GEN(aaa) GEN(bbb) GEN(ccc) GEN(ffffd) GEN##_last(eee)
Finally create what you want to create:
DEFINE_ENUM(LettersEnum, LETTERS);
DEFINE_ARRAY(letters_array, LETTERS);
And this will be converted to:
enum LettersEnum { aaa, bbb, ccc, ffffd, eee };
const char *letters_array[] = { "aaa", "bbb", "ccc", "ffffd", "eee" };