Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 声明这个巨大结构的更好方法?_C_Struct - Fatal编程技术网

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

C 声明这个巨大结构的更好方法?,c,struct,C,Struct,我正在创建一个使用vCardstruct的应用程序。当前,此结构的外观如下所示: typedef struct { char *version; char **names; char *formatted_name; char *nickname; char *organisation; char *title; struct { /* Emails

我正在创建一个使用vCard
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
s内部使用
union
s,反之亦然,这是一种好的做法吗?

是的!把结构分开!(就像有一个巨大的函数。)


如果您
typedef
d保存所有内部结构,这将有所帮助。
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;