定义如下struct:
enum DATATYPE {INT32, FLOAT, DOUBLE};
struct DATA{
enum DATATYPE type;
char buff[8];
};
struct DATA data; <==this data was set by other thread.
那么问题是如何更轻松地打印数据? 我知道&#34;开关&#34;方式。
switch (data.type) {
case INT32:
printf("%d", *(int*)buff);
break;
case FLOAT:
printf("%f", *(float*)buff);
break;
case DOUBLE:
printf("%lf", *(double*)buff);
break;
}
但如果有很多DATATYPE,那将是一个艰难的过程。
我想知道C中有一些动态的投射方式吗?
我的意思是有任何方式:
struct TYPEANDFORMAT {
enum DATATYPE type;
char fmt[10];
};
struct DATA{
enum DATATYPE type;
char buff[8];
};
struct TYPEANDFORMAT TypeFmt[] = {
{INT32, "%d"},
{FLOAT, "%f"},
{DOUBLE, "%lf"},
};
void printData (struct DATA *data)
{
printf(TypeFmt[data->type].fmt, xxxx); <===xxxx is the issue
}
我想应该有一些MACRO可以在这里工作。
答案 0 :(得分:2)
您如何看待使用union结构而不是struct?在你的情况下,这可能会更好。
http://en.wikipedia.org/wiki/Union_type#Difference_between_Union_and_Structure
定义联合:
enum DATATYPE {INT32, FLOAT, DOUBLE};
typedef union myunion
{
double D;
float F;
int I;
}MYUNION;
struct DATA{
enum DATATYPE type;
MYUNION d;
};
之后
switch (data.type) {
case INT32:
printf("%d", data.d.I);
break;
case FLOAT:
printf("%f", data.d.F);
break;
case DOUBLE:
printf("%lf", data.d.D);
break;
}