1

Bungie が BLAM のために実装した「タグベース」のリソース システムに関する記事を読んでいました。ゲームエンジン。そして、不思議な構文 (C 構造体だと思いますか?) に出くわしました。この構文はどのように有効ですか? そして、それはどのような方法で達成されますか?

問題のスニペットを以下に貼り付けました。

TAG_GROUP(
sound_environment,
SOUND_ENVIRONMENT_TAG,
sizeof(sound_environment))
{
     {_field_real, "room intensity"},
     {_field_real, "room intensity hf"},
     {_field_real, "room rolloff (0 to 10)"},
     {_field_real, "decay time (.1 to 20)" },
     {_field_real, "decay hf ratio (.1 to 2)"},
     {_field_real, "reflections intensity:dB[-100,10]"},
     {_field_real, "reflections delay (0 to .3):seconds" },
     {_field_real, "reverb intensity:dB[-100,20]"},
     {_field_real, "reverb delay (0 to .1):seconds"},
     {_field_real, "diffusion"},
     {_field_real, "density"},
     {_field_real, "hf reference(20 to 20,000)},
}; 
4

3 に答える 3

2

これが重要な部分です

TAG_GROUP(
sound_environment,
SOUND_ENVIRONMENT_TAG,
sizeof(sound_environment))

これは、何らかの魔法を行うマクロ「TAG_GROUP」があることを示しています。

于 2012-12-11T00:19:41.147 に答える
1

TAG_GROUP はマクロのように見えます。もしそうなら、それは別のものに展開されています。その場合、展開先に応じて構文が正しい可能性があります。

たとえば、TAG_GROUP が 2D 配列または構造体の配列に展開されている場合、その初期化は標準の初期化リストであるため有効です。

コンパイルされる次のプログラムを見てください。

int main() 
{
    const char* _field_real = "xyz";
    const char* a[12][2] = {
        {_field_real, "room intensity"},
        {_field_real, "room intensity hf"},
        {_field_real, "room rolloff (0 to 10)"},
        {_field_real, "decay time (.1 to 20)" },
        {_field_real, "decay hf ratio (.1 to 2)"},
        {_field_real, "reflections intensity:dB[-100,10]"},
        {_field_real, "reflections delay (0 to .3):seconds" },
        {_field_real, "reverb intensity:dB[-100,20]"},
        {_field_real, "reverb delay (0 to .1):seconds"},
        {_field_real, "diffusion"},
        {_field_real, "density"},
        {_field_real, "hf reference(20 to 20,000)"},
    };     
    return 0;
}

ここで、TAG_NAME がパラメータを使用して適切な定義を構築し、= を追加したとします。次に、基本的に、 const char* a[12][2] (または使用している任意の型) に相当するものを構築しました。

このようなコードを見たときの良い経験則は、マクロを考えて、どの置換が正当なコードにつながるかを考えることです。また、関数のように見えるが、すべて大文字である名前はマクロであるという規則もよく見られます。

于 2012-12-11T00:18:53.973 に答える
0

TAG_GROUP は、データ構造の初期化を少し便利にするために使用されるマクロのように見えます。特筆すべき点は、中かっこの内側では、すべてが初期化コードのように見えることです。したがって、TAG_GROUP は関数シグネチャのマクロではなく、並べ替えの配列を初期化するマクロです。

于 2012-12-11T01:19:41.277 に答える