c++ - 主函数之外的 lual_newstate

标签 c++ lua

我正在使用 Lua5.1 将 Lua 嵌入到 C++ 应用程序中,我遇到了 luaL_newstate() 的奇怪问题。

这个有效:

lua_State *L = NULL;
int main()
{
   L = luaL_newstate();
   return 0;
}

我最近重组了我的代码并选择创建一个像这样的 init 函数:

lua_State *L = NULL;
void init_lua(lua_State *L)
{
   L = luaL_newstate();
}
int main()
{
   init_lua(L);
   return 0;
}

那是行不通的。由于某种原因,luaL_newstate() 在那种情况下总是返回 NULL。但是,更令人困惑的是,这确实有效:

lua_State *L = NULL;
void init_lua(lua_State **L)
{
   *L = luaL_newstate();
}
int main()
{
   init_lua(&L);
   return 0;
}

在功能上,我没有看到第二个和第三个示例之间的区别,但是当我尝试使用 L 进行 lua 调用时,第二个就会出现段错误,而第三个工作得很好。这里发生了什么?

最佳答案

在第二个例子中,这个函数:

void init_lua(lua_State *L)
{
  L = luaL_newstate();
}

您将 L 设置为 luaL_newstate() 的返回值。 L 是指向 lua_state 的指针。但是,您只是更改了 L 的参数版本。

在你的第三个例子中:

void init_lua(lua_State **L)
{
  *L = luaL_nwstate();
}

您正在将 L(这是您全局定义的 L)指向的值设置为 luaL_newstate() 的返回值。因此,您正在更改传递给函数的实际变量。

总结:当您在第二个示例中传递一个 VALUE 时,该函数无法更改原始变量。但是,当您在第三个变量中将 POINTER 传递给变量时,该函数可以使用您传递给它的地址更改该变量的值。

关于c++ - 主函数之外的 lual_newstate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3680667/

相关文章:

lua - 如何在Lua中删除表?

linux - 如何在 linux 中为 zerobrane studio 设置 LUA_PATH 和 LUA_CPATH

c++11 - 单个 Lua 状态下的多个脚本并使用 _ENV

lua - 无法在Lua模式中使用百分比(%)

c++ - 显示所有变量共有的值

c++ - 为什么 printf() 显示的地址输出与 C++ 指针中的 cout 不同?

c++ - 如何使用rapidjson合并两个json文件

c++ - 我如何使用 11 位数字

python - Flask(Python)可以移植到Lua吗?

c++ - 错误 : Declaration terminated incorrectly