我试图静态分配一些结构,每个结构包含两个成员:一个指向结构数组的指针,以及该数组的大小。
这是代码的工作版本:
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
struct conf_element {
char *key;
enum conf_elem_type val_type;
void *val_p;
tok_t *(*fn_p)(const char *js, jsmntok_t *tok);
};
struct conf_schema {
struct conf_element *conf_elems;
size_t size;
};
struct conf_element conf_schema_antennae_elems[] = {
{"key1_nm", LEAF_INT, NULL, NULL},
{"key2_nm", LEAF_INT, NULL, NULL}
};
struct conf_schema conf_schema_antennae = {
conf_schema_antennae_elems,
ARRAY_SIZE(conf_schema_antennae_elems)
};
但是,不是单独定义数组,然后在定义结构时引用该数组,我想用数组文字初始化指针,以便在结构定义中包含它,为了我的目的相信提高可读性:
struct conf_schema conf_schema_antennae = {
(struct conf_element []) {
{"key1_nm", LEAF_INT, NULL, NULL},
{"key2_nm", LEAF_INT, NULL, NULL}
},
/* the size of that ^ compound literal goes here */
};
是否可以在编译时自动获取该数组文字的大小? (或者我是否滥用语言并使事情变得比他们应该更难?)
编辑: 基于奥拉夫对类似问题的答案和约翰·博林格的评论,这是我最终得到的结论:
#define S(arr) {arr, ARRAY_SIZE(arr)}
struct conf_schema conf_schema_antennae = S((
(struct conf_element []) {
{"key1_nm", LEAF_INT, NULL, NULL},
{"key2_nm", LEAF_INT, NULL, NULL}
}
));
#undef S
答案 0 :(得分:2)
您无法知道复合文字数组的大小,因为它的变量名称是隐藏的。
同样struct conf_element *conf_elems
是一个指针,宏ARRAY_SIZE
无法测量真实数组的长度。
如果使用-g
编译,您可以看到隐藏变量的名称。它将在可执行文件的调试信息中显示名为__compond_literal.###
的变量。
我建议你解决一下:你真的需要知道它在客户端代码中的大小吗? 如果没有,试试这个:
struct conf_schema conf_schema_antennae = {
(struct conf_element []) {
{"key1_nm", LEAF_INT, NULL, NULL},
{"key2_nm", LEAF_INT, NULL, NULL},
{0, 0, 0, 0} /* Place holder for the end of the array */
}
};
void client_code ()
{
struct conf_element *p_elems = conf_schema_antennae.conf_elems;
while (p_elems->key)
{
/* ... */
p_elems++;
}
}