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 回答