enum name to string generator

/** based on this solution: http://stackoverflow.com/a/10966395 */

/** Macros to auto-generate enum and to string function */
#define GENERATE_ENUM_LINE(PREFIX, ENUM) PREFIX##_##ENUM,
#define GENERATE_ENUM_CASE_STRING(PREFIX, ENUM) case PREFIX##_##ENUM: return #ENUM;
#define GENERATE_ENUM(NAME, MEMBERS)                                    \
  enum NAME { MEMBERS(NAME, GENERATE_ENUM_LINE) };                      \
  static const char * NAME##String (enum NAME e)                        \
  {                                                                     \
    switch (e) { MEMBERS(NAME, GENERATE_ENUM_CASE_STRING) }             \
    return("Unknown Type");                                             \
  }


/** define enum */
#define FRUIT_ENUM_MEMBERS(NAME, FRUIT)         \
  FRUIT(NAME, apple)                            \
  FRUIT(NAME, orange)                           \
  FRUIT(NAME, grape)                            \
  FRUIT(NAME, banana)

/** and then generate it */
GENERATE_ENUM(fruitEnum, FRUIT_ENUM_MEMBERS)

/** use enum and string converter */
#include <stdio.h>
int main()
{
  enum fruitEnum e;
  e = fruitEnum_apple;
  printf("e = %s\n", fruitEnumString(e));
  e = fruitEnum_apple;
  printf("e = %s\n", fruitEnumString(e));
  e = fruitEnum_orange;
  printf("e = %s\n", fruitEnumString(e));
  e = fruitEnum_grape;
  printf("e = %s\n", fruitEnumString(e));
  e = fruitEnum_banana;
  printf("e = %s\n", fruitEnumString(e));
  e = -1;
  printf("e = %s\n", fruitEnumString(e));
  return 0;
}

Leave a comment