В C ++ / Qt / COM / DCOM есть понятие «Вариант», то есть грубо говоря, объединение, которое также хранит способ обращения к объединению.
В C вы должны предоставить что-то вроде этого:
struct myCVariant
{
int variantType;
union
{
char v1;
int v2;
float v3;
} variantContent;
void initVariant()
{
variantType = 0;
}
void setChar(char a)
{
variantType = 1;
variantContent.v1 = a;
}
void setInt(int a)
{
variantType = 2;
variantContent.v2 = a;
}
// ... and so on
bool getChar(char* pa)
{
if (variantType == 1)
{
*pa = variantContent.v1;
return true;
}
return false; // Error reading a char where something else was stored
}
// ... and so on
};
Вы можете скопировать некоторую реализацию Variant в некоторый исходный код C ++ и перенести ее на C. Это не совсем то же самое, но похоже. И он несколько безопасен (по крайней мере, во время выполнения).
РЕДАКТИРОВАТЬ: гекса избил меня на секунду. И обратите внимание, что я не скомпилировал это, поэтому мой код может содержать опечатки.