给定以下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;
Run Code Online (Sandbox Code Playgroud)
是否可以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 }
};
Run Code Online (Sandbox Code Playgroud)
但我想做更像这样的事情:
const KanaPrefix KANA_TO_ROMAJI[] = {
{ NULL, NULL },
{ "a", NULL },
{ "ki", {
{ 0x3030, "kya" },
{ 0x3032, "kyo" }
} }
};
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
const KanaPrefix KANA_TO_ROMAJI[] = {
{ NULL, NULL },
{ "a", NULL },
{ "ki", (KanaSuffix [2]) {
{ 0x3030, "kya" },
{ 0x3032, "kyo" }
}
}
};
Run Code Online (Sandbox Code Playgroud)
编辑:
我可以[现在]确认这是已定义的行为,因为该复合文字的生命周期[或持续时间] 与静态存储相同:
C99§6.5.2.5复合文字
复合文字的值是初始化列表初始化的未命名对象的值.如果复合文字出现 在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间.
参考文献:
如果您只需要一个静态对象,那么您可以使用复合文字,因为如果在函数范围之外定义,则具有静态存储持续时间.
当然,由于suffixesstruct 的成员KanaPrefix指向多个元素,因此您还需要存储计数:
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
};
Run Code Online (Sandbox Code Playgroud)