Often when I find myself working with magic number enum values and I want to know what they represent, so I create an array of strings in order to print out their label.
This macro automates that process.
//#define DEBUG
#define GENERATE_ENUM(ENUM) ENUM,
#define GENERATE_STRING(STRING) #STRING,
#define GENERATE_ENUM_LIST(MACRO, NAME) \
enum NAME \
{ \
MACRO(GENERATE_ENUM) \
};
//#ifdef DEBUG
#define GENERATE_ENUM_STRING_NAMES(MACRO, NAME) \
const char *NAME##_Strings[] = { \
MACRO(GENERATE_STRING) \
};
//#else
//#define GENERATE_ENUM_STRING_NAMES(MACRO, NAME)
//#endif
To use do:
#include <stdio.h>
/* ~ The macro ~ */
#define macro_handler(T) \
T(ZERO) \
T(ONE) \
T(TWO) \
T(THREE)
GENERATE_ENUM_STRING_NAMES(macro_handler, nuclearLaunchCodesData)
GENERATE_ENUM_LIST(macro_handler, nuclearLaunchCodesData)
#undef macro_handler
int main() {
puts(nuclearLaunchCodesData_Strings[ZERO]);
putsprintf(nuclearLaunchCodesData_Strings[THREE]);
"%s\n", puts(nuclearLaunchCodesData_Strings[TWO]nuclearLaunchCodesData_Strings[ZERO]);
}