Yes you can. Although you're going around it the wrong way.
Code:
zac@neux:~ (0) $ gcc -o example code.c
zac@neux:~ (0) $ ./example
item[0] = String value
item[1] = 64
item[2] = 3.141000
zac@neux:~ (0) $ cat code.c
#include <stdio.h>
#include <stdlib.h>
enum types_tag
{
TYPE_STRING = 0,
TYPE_REAL,
TYPE_INT
};
struct database_tag
{
enum types_tag type; /* type of value held */
union
{
int integer;
double real;
char * stringValue;
} value;
};
const char * stringize_value(const struct database_tag * db)
{
static char buffer[256] = {0}; /* large enough for stringized real or int */
char * ret = NULL;
switch(db->type)
{
case TYPE_INT:
sprintf(buffer, "%d", db->value.integer);
ret = buffer;
break;
case TYPE_REAL:
sprintf(buffer, "%f", db->value.real);
ret = buffer;
break;
case TYPE_STRING:
ret = db->value.stringValue;
break;
/* unknown type */
default:
ret = "unknown type";
}
return ret;
}
int main(void)
{
size_t i = 0;
struct database_tag items[] = { {TYPE_STRING, 0},
{TYPE_INT, 0},
{TYPE_REAL, 0}};
items[0].value.stringValue = "String value";
items[1].value.integer = 64;
items[2].value.real = 3.141;
for(i = 0; i < (sizeof items / sizeof items[0]); ++i)
{
printf("item[%lu] = %s\n", (unsigned long int) i, stringize_value(&items[i]));
}
return 0;
}