声明泛型变量类型

时间:2015-07-10 18:39:12

标签: c

我试图在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 * ]

3 个答案:

答案 0 :(得分:4)

  

使用

可能会出现任何问题

不,因为你不想进行强制转换,因为在分配/ void - 指针(在C中)时不需要强制转换。

  

我只是想知道哪种类型更有用?

两者都是,所以它取决于

  • 1适用于懒惰(因为它只需输入几个,并且几个不同的变量和名称都要记住)。
  • 2是谨慎的(因为它的类型保存,而不是选项1,其中"真实"类型信息丢失,所以你甚至可以分配一个变量'不在ElementType_e中的类型的地址。

参考comment

关于性能,我预计这两种方法之间没有重大差异(如果实施得当),因为两个选项都需要关于分配到/来自的条件定义(这里的异常是指针变量,对于选项1而言,没有用于赋值的条件语句)。

答案 1 :(得分:2)

我建议使用联盟。事实上,我在类似的情况下使用了一个:

ss.ss_family

我在套接字代码中使用此联合,我可以使用IPv4或IPv6地址。在这种特殊情况下,“type”字段实际上是每个内部结构中的第一个字段(sin.sin_familysin6.sin6_familycreate 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;