[英]Static initialization of array of struct A, where struct A contains a pointer to array of struct B (in C)
給定以下typedef:
// Structures for kana to romaji conversion lookup
typedef struct {
const u16 kana; // Kana codepoint
const char* romaji;
} KanaSuffix;
typedef struct {
// Kana codepoint is implied by position in array
const char* romaji;
const KanaSuffix* suffixes;
} KanaPrefix;
是否可以在一個步驟中靜態初始化KanaPrefix
數組,其中數組的某些元素的suffixes
指向KanaSuffix
的靜態數組?
現在我這樣做:
const KanaSuffix KANA_SUFFIXES_KI[] = {
{ 0x3030, "kya" },
{ 0x3032, "kyo" }
};
const KanaPrefix KANA_TO_ROMAJI[] = {
{ NULL, NULL },
{ "a", NULL },
{ "ki", KANA_SUFFIXES_KI }
};
但我想做更像這樣的事情:
const KanaPrefix KANA_TO_ROMAJI[] = {
{ NULL, NULL },
{ "a", NULL },
{ "ki", {
{ 0x3030, "kya" },
{ 0x3032, "kyo" }
} }
};
你可以這樣做:
const KanaPrefix KANA_TO_ROMAJI[] = {
{ NULL, NULL },
{ "a", NULL },
{ "ki", (KanaSuffix [2]) {
{ 0x3030, "kya" },
{ 0x3032, "kyo" }
}
}
};
編輯 :
我可以[現在]確認這是已定義的行為,因為該復合文字的生命周期[或持續時間]與靜態存儲相同:
C99§6.5.2.5復合文字
復合文字的值是初始化列表初始化的未命名對象的值。 如果復合文字出現在函數體外 ,則該對象具有靜態存儲持續時間; 否則,它具有與封閉塊相關的自動存儲持續時間。
參考文獻:
如果您只需要一個靜態對象,那么您可以使用復合文字,因為如果在函數范圍之外定義,則具有靜態存儲持續時間。
當然,由於struct KanaPrefix
的成員suffixes
指向多個元素,因此您還需要存儲計數:
typedef struct {
const char* romaji;
const KanaSuffix* suffixes;
const size_t count;
} KanaPrefix;
const KanaPrefix KANA_TO_ROMAJI[] = {
{ NULL, NULL , 0 },
{ "a", NULL , 0 },
{ "ki", ( KanaSuffix[2] ){ //this is a compound literal
{ 0x3030, "kya" },
{ 0x3032, "kyo" }
} , 2 } //count is here
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.