[英]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.