7

我正在尝试静态分配一些结构,每个结构都包含两个成员:一个指向结构数组的指针,以及该数组的大小。

这是代码的工作版本:

#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
4

1 回答 1

3

您无法知道复合文字数组的大小,因为它的变量名是隐藏的。

同样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++;
    }
}
于 2016-11-29T17:30:11.733 回答