有没有办法让一个结构的单个成员持有不同结构类型中的一个?

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 unionstruct 类似,不同之处在于它在任何给定时间仅包含一个成员。

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;

的成员访问