Skip to main content
Rollback to Revision 6
Source Link
pacmaninbw
  • 26.1k
  • 13
  • 47
  • 114

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]);
}

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]);
  puts(nuclearLaunchCodesData_Strings[THREE]);
  puts(nuclearLaunchCodesData_Strings[TWO]);
}

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)

GENERATE_ENUM_STRING_NAMES(macro_handler, nuclearLaunchCodesData)
GENERATE_ENUM_LIST(macro_handler, nuclearLaunchCodesData)
#undef macro_handler

int main() {
  printf("%s\n", nuclearLaunchCodesData_Strings[ZERO]);
}
added 92 characters in body
Source Link
Alex Angel
  • 527
  • 5
  • 14

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() {
  printfputs("%s\n", nuclearLaunchCodesData_Strings[ZERO]);
  puts(nuclearLaunchCodesData_Strings[THREE]);
  puts(nuclearLaunchCodesData_Strings[TWO]);
}

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)

GENERATE_ENUM_STRING_NAMES(macro_handler, nuclearLaunchCodesData)
GENERATE_ENUM_LIST(macro_handler, nuclearLaunchCodesData)
#undef macro_handler

int main() {
  printf("%s\n", nuclearLaunchCodesData_Strings[ZERO]);
}

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]);
  puts(nuclearLaunchCodesData_Strings[THREE]);
  puts(nuclearLaunchCodesData_Strings[TWO]);
}
Tweeted twitter.com/StackCodeReview/status/1554346258772508672
added macro list generation to make example work
Source Link
Alex Angel
  • 527
  • 5
  • 14

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(ONEZERO) \
  T(TWOONE) \
  T(THREETWO)

GENERATE_ENUM_STRING_NAMES(macro_handler, nuclearLaunchCodesData)
GENERATE_ENUM_LIST(macro_handler, nuclearLaunchCodesData)
#undef macro_handler

int main() {
  printf("%s\n", nuclearLaunchCodesData_Strings[0]nuclearLaunchCodesData_Strings[ZERO]);
}

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(ONE) \
  T(TWO) \
  T(THREE)

GENERATE_ENUM_STRING_NAMES(macro_handler, nuclearLaunchCodesData)
#undef macro_handler

int main() {
  printf("%s\n", nuclearLaunchCodesData_Strings[0]);
}

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)

GENERATE_ENUM_STRING_NAMES(macro_handler, nuclearLaunchCodesData)
GENERATE_ENUM_LIST(macro_handler, nuclearLaunchCodesData)
#undef macro_handler

int main() {
  printf("%s\n", nuclearLaunchCodesData_Strings[ZERO]);
}
Made example more readable
Source Link
Alex Angel
  • 527
  • 5
  • 14
Loading
Spelling: emum/enum
Link
AJNeufeld
  • 35.3k
  • 5
  • 41
  • 103
Loading
Fixed macro #undef
Source Link
Alex Angel
  • 527
  • 5
  • 14
Loading
move description to beginning so that the question summary on the home page isn't "..."
Source Link
L. F.
  • 9.7k
  • 2
  • 27
  • 70
Loading
Source Link
Alex Angel
  • 527
  • 5
  • 14
Loading