有没有办法让一个结构的单个成员持有不同结构类型中的一个?
Is there a way to have a single member of a struct hold one out of different struct types?
我正在编写一些代码,根据用户调用的系列函数将输出写入不同的 streams/files。我试图尽可能简洁地做到这一点,并且在我用来调用实际写入函数的结构中没有大量未使用的信息。目前我有一个基本结构(这只是一个粗略的草稿):
typedef int (*Write_Out) (char *src, size_t len);
typedef struct s_vas_info
{
char **ret;
int prev_size;
} t_vas_info;
typedef struct s_vd_info
{
int fd;
} t_vd_info;
typedef struct s_vf_info
{
FILE *fp;
} t_vf_info;
typedef struct s_vsn_info
{
size_t size;
char * restrict str;
} t_vsn_info;
typedef struct s_writer
{
int curr;
Write_Out ft_write;
} t_writer;
其中 Write_Out 将指向将输出发送到正确目的地的函数,t_writer 将保存执行此操作的所有信息,并在调用相应函数时使用其他结构。现在我真的很希望 s_writer 类型有一个包含其他结构类型之一的成员(如果可能的话直接,如果可以避免的话,我不打算用指针和强制转换来解决这个问题)。我对此很陌生,所以我不知道这是否可能(使用这些或其他数据类型)。如有任何帮助,我们将不胜感激!
可以,使用 union
关键字。
你会得到类似的东西:
typedef struct s_mystruct
{
union
{
t_writer writer;
t_vsn_info vsn_info;
t_vf_info vf_info;
t_vd_info vd_info;
t_vas_info vas_info;
} u_type;
} t_mystruct;
为此你需要 union
.
A union
与 struct
类似,不同之处在于它在任何给定时间仅包含一个成员。
typedef struct s_writer
{
int curr;
Write_Out ft_write;
int active;
union {
struct {
char **vas_ret;
int vas_prev_size;
};
struct {
int vd_fd;
};
struct {
FILE *vf_fp;
};
struct {
size_t vsn_size;
char * restrict vsn_str;
};
};
} t_writer;
您可以使用 active
字段来确定哪个联合字段包含实际数据。另请注意,联合及其内部结构没有名称,因此可以直接将其成员作为 t_writer
;
的成员访问
我正在编写一些代码,根据用户调用的系列函数将输出写入不同的 streams/files。我试图尽可能简洁地做到这一点,并且在我用来调用实际写入函数的结构中没有大量未使用的信息。目前我有一个基本结构(这只是一个粗略的草稿):
typedef int (*Write_Out) (char *src, size_t len);
typedef struct s_vas_info
{
char **ret;
int prev_size;
} t_vas_info;
typedef struct s_vd_info
{
int fd;
} t_vd_info;
typedef struct s_vf_info
{
FILE *fp;
} t_vf_info;
typedef struct s_vsn_info
{
size_t size;
char * restrict str;
} t_vsn_info;
typedef struct s_writer
{
int curr;
Write_Out ft_write;
} t_writer;
其中 Write_Out 将指向将输出发送到正确目的地的函数,t_writer 将保存执行此操作的所有信息,并在调用相应函数时使用其他结构。现在我真的很希望 s_writer 类型有一个包含其他结构类型之一的成员(如果可能的话直接,如果可以避免的话,我不打算用指针和强制转换来解决这个问题)。我对此很陌生,所以我不知道这是否可能(使用这些或其他数据类型)。如有任何帮助,我们将不胜感激!
可以,使用 union
关键字。
你会得到类似的东西:
typedef struct s_mystruct
{
union
{
t_writer writer;
t_vsn_info vsn_info;
t_vf_info vf_info;
t_vd_info vd_info;
t_vas_info vas_info;
} u_type;
} t_mystruct;
为此你需要 union
.
A union
与 struct
类似,不同之处在于它在任何给定时间仅包含一个成员。
typedef struct s_writer
{
int curr;
Write_Out ft_write;
int active;
union {
struct {
char **vas_ret;
int vas_prev_size;
};
struct {
int vd_fd;
};
struct {
FILE *vf_fp;
};
struct {
size_t vsn_size;
char * restrict vsn_str;
};
};
} t_writer;
您可以使用 active
字段来确定哪个联合字段包含实际数据。另请注意,联合及其内部结构没有名称,因此可以直接将其成员作为 t_writer
;