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