2016-07-10 13 views
3

静的初期化、

// 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; 

がAに静的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

あらゆる 'KanaPrefix'がKanaSuffix''の同じ番号を持っていますか? – v7d8dpo4

+0

残念ながら、しかし良い質問です。 – bsa

答えて

6

あなたが好きな何かを行うことができます:

const KanaPrefix KANA_TO_ROMAJI[] = { 
    { NULL, NULL }, 
    { "a", NULL }, 
    { "ki", (KanaSuffix [2]) { 
     { 0x3030, "kya" }, 
     { 0x3032, "kyo" } 
    } 
    } 
}; 

EDIT

リテラルその化合物の寿命【または持続時間]は静的ストレージのと同じであるので、私は[今]、この定義された動作を確認することができる:

C99§6.5.2.5化合リテラル

複合リテラルの値は、初期化リストによって初期化された無名オブジェクト の値です。複合リテラルが発生した場合 本体の外にあるのオブジェクトには、静的記憶域 があります。それ以外の場合は、囲みブロック に関連付けられた自動記憶期間があります。

参考文献:

What is the lifetime of compound literals passed as arguments?

+0

答えてくれてありがとう、それはよさそうだよ!今私の電話でこれを見て、私が家に帰るときにそれを試してみましょう。 – bsa

6

あなたが必要とするすべての静的オブジェクトである場合、関数のスコープの外で定義されている場合は、静的記憶域期間を持っているので、あなたは、複合リテラルを使用することができます。もちろん

構造体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 
}; 
+0

ありがとうございました。それはカウントについての良い点です! – bsa

+0

索引 '{" ki "、(KanaSuffix []){'なしの複合リテラルを使うことができます。 –

+0

サイズを省略することができてうれしい、デビッドに感謝! – bsa

関連する問題