声明这个庞大的结构体有更好的方法吗?

3

我正在创建一个应用程序,该应用程序使用 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 是否是一个好的实践?


2
如果您将所有内部结构体都进行了typedef,那将会很有帮助。 - Paul R
1个回答

8
是的!将结构体分开!(就像在有巨大函数时一样。)
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接