给出以下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" }
} }
};
答案 0 :(得分:6)
您可以执行以下操作:
const KanaPrefix KANA_TO_ROMAJI[] = {
{ NULL, NULL },
{ "a", NULL },
{ "ki", (KanaSuffix [2]) {
{ 0x3030, "kya" },
{ 0x3032, "kyo" }
}
}
};
修改强>:
我可以[现在]确认这是已定义的行为,因为复合文字的生命周期[或持续时间]与静态存储相同:
C99§6.5.2.5复合文字
复合文字的值是未命名对象的值 由初始化列表初始化。如果出现复合文字 在函数体外,该对象具有静态存储 持续时间;否则,它有自动存储持续时间 封闭的块。
参考文献:
What is the lifetime of compound literals passed as arguments?
答案 1 :(得分:6)
如果您只需要一个静态对象,那么您可以使用复合文字,因为如果在函数范围之外定义,则具有静态存储持续时间。
当然,由于结构suffixes
的成员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
};