struct A数组的静态初始化,其中struct A包含指向struct B数组的指针(在C中)

bsa*_*bsa 3 c arrays struct

给定以下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)

pah*_*pah 6

你可以这样做:

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复合文字

复合文字的值是初始化列表初始化的未命名对象的值.如果复合文字出现 在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间.

参考文献:

作为参数传递的复合文字的生命周期是多少?


250*_*501 6

如果您只需要一个静态对象,那么您可以使用复合文字,因为如果在函数范围之外定义,则具有静态存储持续时间.

当然,由于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)