簡體   English   中英

sizeof復合文字數組

[英]sizeof compound literal array

我試圖靜態分配一些結構,每個結構包含兩個成員:一個指向結構數組的指針,以及該數組的大小。

這是代碼的工作版本:

#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

您無法知道復合文字數組的大小,因為它的變量名稱是隱藏的。

另外struct conf_element *conf_elems是一個指針,宏ARRAY_SIZE不能測量實數組的長度。

如果使用-g編譯,則可以看到隱藏變量的名稱。 它將在可執行文件的調試信息中顯示名為__compond_literal.###的變量__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++;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM