c - 声明这个巨大结构的更好方法?

标签 c struct

我正在创建一个使用 vCard struct 的应用程序。目前,这个 struct 看起来像这样:

typedef struct {
    char        *version;
    char        **names;
    char        *formatted_name;
    char        *nickname;
    char        *organisation;
    char        *title;
    struct {    /* Emails */
        char        *global_type;
        char        *type;
        char        *address;
        /* Meant to be a boolean which C doesn't have -_- */
        unsigned    preferred : 1;
    } *emails;
    struct {    /* Phones */
        char        *type;
        char        *number;
        unsigned    preferred : 1;
    } *phones;
    struct {    /* Addresses */
        char        *type;
        char        *street;
        char        *city;
        char        *postal_code;
        char        *country;
        unsigned    preferred : 1;
    } *addresses;
    time_t      birthday;
    struct {    /* Custom Fields */
        char        *field_name;
        union {
            /* Single value */
            int         i;
            float       f;
            double      d;
            time_t      t;
            struct {
                char        *global_type;
                char        *type;
                char        *address;
                /* Meant to be a boolean which C doesn't have -_- */
                unsigned    preferred : 1;
            } email;
            struct {
                char        *type;
                char        *number;
                unsigned    preferred : 1;
            } phone;
            struct {
                char        *type;
                char        *street;
                char        *city;
                char        *postal_code;
                char        *country;
                unsigned    preferred : 1;
            } address;
            char        *s;
            /* Multiple values */
            int         *is;
            float       *fs;
            double      *ds;
            time_t      *ts;
            struct {
                char        *global_type;
                char        *type;
                char        *address;
                /* Meant to be a boolean which C doesn't have -_- */
                unsigned    preferred : 1;
            } *emails;
            struct {
                char        *type;
                char        *number;
                unsigned    preferred : 1;
            } *phones;
            struct {
                char        *type;
                char        *street;
                char        *city;
                char        *postal_code;
                char        *country;
                unsigned    preferred : 1;
            } *addresses;
            char        **ss;
        } field_value;
    } *custom_fields;
} vCard;

这个很大,需要很多内存。我也用了很多指针。有没有更好更简洁的方法来声明此 struct?谢谢。


此外,在 struct 内部使用 union 是否是一种好习惯,反之亦然?

最佳答案

是的!拆分结构! (就像有一个巨大的功能时一样。)

typedef struct {
    char        *global_type;
    char        *type;
    char        *address;
    /* Meant to be a boolean which C doesn't have -_- */
    unsigned    preferred : 1;
} vCardEmail;

...

typedef struct {    /* Custom Fields */
    char        *field_name;
    union {
        /* Single value */
        int         i;
        float       f;
        double      d;
        time_t      t;
        vCardEmail email;
        vCardPhone phone;
        vCardAddress address;
        char        *s;
        /* Multiple values */
        int         *is;
        float       *fs;
        double      *ds;
        time_t      *ts;
        vCardEmail *emails;
        vCardPhone *phones;
        vCardAddress *addresses;
        char        **ss;
    } field_value;
} vCardCustomField;

typedef struct {
    char        *version;
    char        **names;
    char        *formatted_name;
    char        *nickname;
    char        *organisation;
    char        *title;
    vCardEmail *emails;
    vCardPhone *phones;
    vCardAddress *addresses;
    time_t      birthday;
    vCardCustomField *custom_fields;
} vCard;

关于c - 声明这个巨大结构的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3418534/

相关文章:

c - 使用 fgets && sscanf 从数组中读取

c - 在结构数组上使用 realloc

c - 如何使用c从csv文件中获取具有精确数据的特定行?

mysql - 如果数据库 golang mysql 中的字段为空,则处理结果

c# - 当结构仅在运行时已知时,将结构从 C++ 传递到 C#

android - openSL ES for Jelly Bean 4.3 支持音频路由切换吗?

c - 如何在不改变指针指向地址的情况下改变指针的内容?

C:无法从文件打印

c - 在c中的while循环中给出2个输出

c - 如何对结构数组中的字符串进行冒泡排序