我试图在C中声明一个泛型变量类型(我不能用C ++),我想到了以下几个选项。
选项1
typedef struct
{
void *value;
ElementType_e type;
} Data_t;
选项2
typedef struct {
ElementType_e type;
union {
int a;
float b;
char c;
} my_union;
} my_struct;
其中ElementType_e是一个包含所有可能类型变量的枚举(例如int,char,unsigned int等)。我有点倾向于选项1,因为与开关相比,我不相信投射会增加额外的计算时间,对吗?
我只是想知道哪种类型更有用?我知道选项1将需要每次使用/访问。是否存在任何可能发生的问题(特别是在不同平台上运行/编译代码,例如32位和16位微代码)
虽然option2要求switch()进行任何操作(例如添加,......)。
以下链接解释了选项2更好(从可读性的角度来看),但我主要关注代码大小和计算成本。 Generic data type in C [ void * ]
答案 0 :(得分:4)
使用
可能会出现任何问题
不,因为你不想进行强制转换,因为在分配/ void
- 指针(在C中)时不需要强制转换。
我只是想知道哪种类型更有用?
两者都是,所以它取决于
ElementType_e
中的类型的地址。参考comment:
关于性能,我预计这两种方法之间没有重大差异(如果实施得当),因为两个选项都需要关于分配到/来自的条件定义(这里的异常是指针变量,对于选项1而言,没有用于赋值的条件语句)。
答案 1 :(得分:2)
我建议使用联盟。事实上,我在类似的情况下使用了一个:
ss.ss_family
我在套接字代码中使用此联合,我可以使用IPv4或IPv6地址。在这种特殊情况下,“type”字段实际上是每个内部结构中的第一个字段(sin.sin_family
,sin6.sin6_family
和create table A
(
Order1 int,
Order2 int,
Order3 int,
Order4 int
)
create table B
(
Order1 int,
Order2 int,
Order3 int,
Order4 int
)
insert into A values
(1, 1, 40, 10),
(2, 2, 2, 20)
insert into B values
(3, 3, 3, 30),
(4, 4, 4, 40)
)。
答案 2 :(得分:1)
我认为问题没有得到很好的解决,因为程序员可以定义无限可能的数据类型。例如,考虑以下顺序:
typedef char S0_t;
typedef struct { S0_t x; } S1_t;
typedef struct { S1_t x; } S2_t;
typedef struct { S2_t x; } S3_t;
很明显,我们可以无限期地关注,以便根据需要定义尽可能多的新类型。
因此,没有一种直接的方式来处理这种可能性。
另一方面,由于指针具有更灵活的特性,因此您可以决定仅使用指针类型来定义一个通用类型。
因此,项目中使用的类型必须只是指针
通过这种方式,可能会像以下定义一样非常简单:
typedef void* generic_t;