gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:30 25 4
gpt4 key购买 nike

在结构下面定义:

enum DATATYPE {INT32, FLOAT, DOUBLE};
struct DATA{
enum DATATYPE type;
char buff[8];
};

struct DATA data; <==this data was set by other thread.

那么问题来了,如何更简单的打印数据呢?我知道“切换”方式。

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

最佳答案

您如何看待使用 union 结构而不是结构?这对你来说可能会更好。

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

关于转换数据取决于 C 中的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25740314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com