使用#define初始化c中的结构数组

时间:2013-05-14 10:24:03

标签: c gcc struct

以下代码给出了这个警告:

tag_info.h:17: warning: missing braces around initializer
tag_info.h:17: warning: (near initialization for âtag_list_data[0].subtagsâ)

我尝试了很多东西,但似乎没有任何工作。任何人都可以提出建议吗

typedef struct Attr{    
            char attr_name[64];             
            value_type_t value;             
            int mandatory;                  
}Attr_t;

typedef struct Tags {
        unsigned int tag_id;           
        Attr_t *attr_list;              
        char *tag_name;                
        int tag_type;                   
        int subtags[html_subtag_num];   
}Tags_t;

Tags_t tag_list_data[150] = {
        #include "tag_info.h"
        {0,0,0,0,0}
};

where the "tag_info.h" contains :
#if defined(TAG_DEFINE)
      #undef TAG_DEFINE
#else
      #define TAG_DEFINE(a,b,c,...) {.tag_id=a, .tag_name=#b, .tag_type=c, ##__VA_ARGS__}
#endif

TAG_DEFINE(0,TAG_NONE,0,0),
TAG_DEFINE(1,!--,0,0),
TAG_DEFINE(2,!doctype,0,0),
TAG_DEFINE(3,a, 1, 1, 117, 59,11,118,92,100),

1 个答案:

答案 0 :(得分:0)

您正在初始化subtags,好像它是Tags结构的多个成员:

typedef struct Tags {
    ...
    int subtags_0;
    int subtags_1;
    int subtags_2;
} Tags_t;

Tags_t t = { ..., 0, 1, 2 };

但它是一个数组。因此,您应该将其初始化为单个实体。

typedef struct Tags {
    ...
    int subtags[html_subtag_num];
} Tags_t;

Tags_t t = { .tag_id = 0, ..., { 0, 1, 2 } };
// or 
Tags_t t = { .tag_id = 0, ..., .subtags = { 0, 1, 2 } };

此外,您不需要使用连接(##

 #define TAG_DEFINE(a,b,c,...) { ..., ## __VA_ARGS__}

最后,它应该看起来像

 #define TAG_DEFINE(a,b,c,...) { ..., .subtags = { __VA_ARGS__ } }
 ...
 Tags_t tag_list_data[150] = {
     ...
     { 0,0,0,0,{0}}
 }

而不是

#define TAG_DEFINE(a,b,c,...) { ..., ##__VA_ARGS__}
...
Tags_t tag_list_data[150] = {
   ...
   { 0,0,0,0,0 }
}