David Priver, July 30th, 2024
I was reading Hacker News when I saw the link to this article. I've been playing around with D lately and thought to myself "I bet D could do this as well". D added the ability to import C files (with macros) and has strong reflection capabilities as well.
So here is my attempt at that:
With a C file with macros:
// macros.c // #include <Windows.h> // just #define the macros here for simplicity #define WM_A 0x1 #define WM_B 0x2 #define WM_C 0x3
And a D file to import the C file:
// imports the C file "macros.c" import macros; import std.stdio: writeln; void print_macro(int num){ switch(num){ // compile time foreach so we can generate cases static foreach(m; __traits(allMembers, macros)){ static if(m.length > 3 && m[0..3] == "WM_"){ case __traits(getMember, macros, m): writeln(m, ": ", num); return; } } default: writeln("unknown macro: ", num); return; } } void main(){ print_macro(0x1); print_macro(0x2); print_macro(0x3); print_macro(0x4); }
Compile and run it:
$ ldc2 mac.d -of mac $ ./mac WM_A: 1 WM_B: 2 WM_C: 3 unknown macro: 4
All code in this article is released into the public domain.