DEV Community

Cover image for Automatic Enum Handling in C — Parsing, Validating and Iterating.
Yair Lenga
Yair Lenga

Posted on

Automatic Enum Handling in C — Parsing, Validating and Iterating.

In a previous post, Automatic Enum Stringification in C via Build-Time Code Generation, I described how to extract enum labels and values directly from DWARF debug information at build time.

enum color { C_NONE, C_RED, C_YELLOW, C_GREEN } ;

// Request enum descriptor for e_color
ENUM_DESCRIBE(e_color, enum color)
void foo(enum color c) {
    printf("Color=%s(%d)\n", ENUM_LABEL_OF(e_color, c), c) ; 
}
Enter fullscreen mode Exit fullscreen mode

In a follow-up article, I wrote about the next logical step: reverse conversion from symbolic name to value. This is useful when reading external input keyed by enum values: command-line arguments, configuration files, or user input.

ENUM_DESCRIBE(e_color, enum color)

bool parse_color(const char *label, enum color *var)
{
    return ENUM_PARSE_LABEL(e_color, label, var) ;
}
Enter fullscreen mode Exit fullscreen mode

Medium Article (No Paywall): Automatic Enum Handling in C — Parsing, Validating and Iterating.

Beyond simple conversion label -> value, the collected metadata can be used to iterate over all enum values. This enables more advanced matching (e.g., partial or best match), or integration with external data keyed by enum values.

In some cases, it can be useful to have the enum metadata available outside the C program. The extraction script can produce the information in TOML format - which can be read directly into Python or Java.

[enum.currency]
_.count = 154
_.symbol = "enum_req_currency"
_.anchor = "enum_type_currency"
_.name = "currency_code"
_.byte_size = 4

ISO3_AED = 784
ISO3_AFN = 971
ISO3_ALL = 8
ISO3_AMD = 51
ISO3_ANG = 532
ISO3_AOA = 973
ISO3_ARS = 32
ISO3_AUD = 36
Enter fullscreen mode Exit fullscreen mode

Until C has reflection, extracting the enum label/value pairs from the debug section can provide an effective way to use this information in C programs. This gives you reflection-like capabilities in plain C — without changing your source code.

  • No changes to existing enum definitions in the source code.
  • No duplicate definitions.
  • No runtime dependency on external tools or libraries.
  • Always in sync with the compiled enum.

A compact package (~20KB) (one ".c" file, one ".h" file, and Python script to extract debug information from object files) is available here:

https://github.com/yairlenga/c-enum-reflect/releases/latest

See the Releases page for other versions and packages.

Top comments (0)