#include #include #include #include #include enum class A : uint8_t { A_A1, A_A2, A_A3, /// Must be last for serialization purposes A_Sentinel, }; enum class B : uint8_t { B_B1, B_B2, B_B3, /// Must be last for serialization purposes B_Sentinel, }; union C { enum class Tag : uint8_t { C_C1, C_C2, C_C3, /// Must be last for serialization purposes C_Sentinel, }; struct C_C1_Body { Tag tag; uint32_t a; }; struct C_C2_Body { Tag tag; uint32_t b; }; struct { Tag tag; }; C_C1_Body c1; C_C2_Body c2; }; extern "C" { void root(A a, B b, C c); } // extern "C"