这个C++代码片段的语法是什么?

3

经过多年的Java、JavaScript和Python编程,我不仅忘记了C++语言,而且对其语法也感到困惑。

http://heavycoder.com/tutorials/lua_embed.php

static const luaL_reg lualibs[] =
{
        { "base",       luaopen_base },
        { NULL,         NULL }
};

如何使用2D数组初始化lualibs?虽然luaL_reg是一种类型,但显然不是数组。

const luaL_reg *lib;

for (lib = lualibs; lib->func != NULL; lib++)
{
    lib->func(l);
    lua_settop(l, 0);
}
2个回答

2

luaL_reg是一个有两个元素的struct这里是快速谷歌搜索到的关于它的信息。

第一个代码片段正在创建一个luaL_regstruct数组:

  • 第一个struct用这两个值初始化:{ "base", luaopen_base }
  • 数组中的第二个luaL_regstruct设置为:{ NULL, NULL }

总之,它不是一个二维数组,而是一个structs数组,每个struct包含两个元素。

第二个例子现在应该相当容易理解了;lib是指向luaL_regstruct的指针。


2

luaL_reg 可能长成以下这个样子。

typedef struct luaL_reg_t {
  char const * const name;
  void(*func)(< type_of_<l> >);
} luaL_reg;

使用{}可以设置对象的成员,如下例所示,将会把成员name指向"hello world"的位置,而func则指向my_function的地址。

luaL_reg obj = {"hello world", my_function};

在初始化数组成员时,前面代码段中显示的语法也可以使用。在下面的代码段中,一个 const luaL_reg 实例的数组被设置为包含两个对象,第一个对象的 name = "base",func 设置为 luaopen_base。
需要说明的是,下面的内容不是2D数组,而是使用 {} 初始化每个实例的成员的 const luaL_reg 数组。
static const luaL_reg lualibs[] =
{
  { "base",       luaopen_base },
  { NULL,         NULL }
};

最后一个元素用于简化数组的迭代,将两个成员都设置为NULL可以轻松地看到我们是否已经到达了最后一个元素。

下面代码片段中的循环利用了这一点。只要成员func不等于NULL,我们就没有到达数组的末尾。

for (lib = lualibs; lib->func != NULL; lib++) {
  lib->func(l);
  lua_settop(l, 0);
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接