There is an old pre-processor trick for this:
Gadget.data
DEFINE_GADGET(First)
DEFINE_GADGET(Second)
Gadget.**
#define QUOTE_VAL(X) #X
enum Gadget
{
#define DEFINE_GADGET(X) X,
#include "Gadget.data"
#undef DEFINE_GADGET(X)
};
const char* gadget_debug_names[] = {
#define DEFINE_GADGET(X) QUOTE_VAL(X),
#include "Gadget.data"
#undef DEFINE_GADGET(X)
};