我正在阅读Bungie为BLAM实施的'基于标签的'资源系统上的article!游戏引擎。我发现了一种神秘的语法(我认为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)},
};
答案 0 :(得分:2)
这是关键部分
TAG_GROUP(
sound_environment,
SOUND_ENVIRONMENT_TAG,
sizeof(sound_environment))
这表明有一个宏“TAG_GROUP”做了一些魔术。
答案 1 :(得分: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](或者它正在使用的任何类型)的等价物。
当你看到这样的代码时,一个好的经验法则是思考宏观,并考虑哪些替换可以导致合法代码。此外,我经常看到的一个约定是,看起来像函数但是全部大写的名称都是宏。
答案 2 :(得分:0)
TAG_GROUP看起来像一个宏,用于初始化数据结构,方便一点。赠品是在大括号内,一切看起来像初始化代码。 因此,TAG_GROUP不是函数签名的宏,而是初始化排序数组的宏。