Лучший способ объявить эту огромную структуру? - PullRequest
3 голосов
/ 05 августа 2010

Я создаю приложение, которое использует 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? Спасибо.


Кроме того, рекомендуется ли использовать union s внутри struct s и наоборот?

1 Ответ

8 голосов
/ 05 августа 2010

Да!Сплит разбивается на части!(так же, как когда есть огромная функция.)

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...