转换数据取决于C中的数据类型

时间:2014-09-09 08:50:15

标签: c enums

定义如下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可以在这里工作。

1 个答案:

答案 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;
}