Вы можете сделать это, если все ваши типы объединений являются указателями, используя указатель void в качестве первого элемента объединения.Все указатели могут быть преобразованы в указатель void, поэтому ваш союз может быть инициализирован с произвольным типом указателя.Для данного примера вы получите:
struct Data
{
int x;
union
{
const void* unused;
const Data* data;
struct {int x; int y; }*; //Not sure this works written like this
const char* asChar;
const int* asInt;
};
};
static Data d1;
static Data d2 = {2, &d1};
static Data d3 = {1, "Hello, world!"};
Другая возможность - сделать это на C.В C вы можете указать, какая часть объединения инициализируется.Используя вашу оригинальную структуру (и присваивая вашей структуре имя asStruct):
static Data d1;
static Data d2 = {2, &d1};
static Data d3 = {3, {.asStruct = {0,0}}