簡體   English   中英

struct A數組的靜態初始化,其中struct A包含指向struct B數組的指針(在C中)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM