c - C 中多种数据类型的统一句柄参数

标签 c struct unions

这是用 C 编写的。我有一个在许多文件中使用的句柄(我们称之为 type_handle),目前它是一个 enum,但目前我需要扩展它以支持 typedef-ed 结构(称为 my_type)。由于许多函数都将 type_handle 作为输入参数,因此我不想对设计进行重大更改,从而需要重做所有文件。所以我的想法是传递intfloatdouble,然后传递my_type。我想要某种我想要的所有类型的 union 函数,这样我就不需要修改采用 type_handle 的函数。我应该如何设计这个?

typedef enum
{
    INT  = MPI_INT,
    INT8 = MPI_INT8_T,
    INT16 = MPI_INT16_T
}
types_t;

typedef union {
    my_type dtype;
    types_t etype;
} type_handle;

我想以一种方式进行设计,使得 any_func(type_handle type) 可以接受 any_func(INT) 以及 any_func(dtype) code> 其中 dtype 是 my_type 类型的派生数据类型。

最佳答案

在 C 中使用union 时,您需要某种方法来知道要使用哪个成员。 C 本身无法告诉您 union 中的哪个元素是您分配的元素。这解释起来会很困惑,因为你已经在处理类型了,但习惯用法是:

struct {
   what_is_in_the_union_t what;
   union {
       type_a a;
       type_b b;
       ...
   } u;
};

其中 what_is_in_the_union_t 是您自己的 { TYPE_A, TYPE_B, ... } 枚举。正如我所说,这将在您的示例中以令人困惑的方式扩展,因为您的内部 type_a 已经是 types_t

关于c - C 中多种数据类型的统一句柄参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18093546/

相关文章:

c - 如何查询多个 pthread(子线程)以了解哪一个线程终止

c++ - 我的 C++ 函数在不应该的时候破坏了变量

c++ - union 中的友元函数出现错误 "... does not name a type"- 为什么?怎么修?

c++ - 在另一个结构中初始化一个结构数组

c - C 中未命名的结构/union 有什么好处?

C++(以某种方式)将结构限制为父 union 大小

c - 使用指针和 offsetof() 访问结构的正确方法是什么

c - 用于查找容器内部容器名称的 C 程序 - LXC

c - 最高有效半字节的十六进制

c++ - Printf 疯了