【问题标题】:Printing a static variable inside a C++ function called from lua在从 lua 调用的 C++ 函数中打印静态变量
【发布时间】:2019-12-10 18:36:12
【问题描述】:

我正在从我的 lua 模块调用共享对象文件中定义的 C++ 函数(print_no)。 C++ 函数接受从 lua 传递的参数并使用它来初始化静态变量。

我期待当这个函数被多次调用时,变量将保留它在第一次调用时获得的值。这是我目前对函数内部静态变量的理解。

这是我的 C++ 代码(test.cpp)

extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

static int print_no(lua_State *L)
{
  static double d = lua_tonumber(L, 1); /* get argument */
  return 1; /* number of results */
}

static const struct luaL_Reg mylib [] =
{
  {"print_no", print_no},
  {NULL, NULL} /* sentinel */
};

extern "C"
{
  int luaopen_mylib (lua_State *L)
  {
    luaL_register(L, "mylib", mylib);
    return 1;
  }
}

我使用以下命令制作了一个 .so 文件:

g++ -shared -o mylib.so test.cpp -fPIC

下面是我的 lua 代码(module.lua)

temp = require "mylib"
print(temp.print_no(5))
print(temp.print_no(6))

下面是我运行这个模块时的输出:

[vishal@localhost test]$ lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

[vishal@localhost test]$ lua module.lua
5
6

我原以为时间 5 都会被打印出来。我的理解有什么问题?

【问题讨论】:

  • 为什么两次都是5?你只是总是将一个参数传递给print_no 函数,所以它会打印这个参数:)

标签: c++ lua


【解决方案1】:

您没有将结果推回 lua 堆栈,因此 lua 只是读取堆栈上的下一个值,即您传递给 print_no 的参数。

试试:

static int print_no(lua_State *L)
{
  static double d = lua_tonumber(L, 1); /* get argument */
  lua_pushnumber(L, d);
  return 1; /* number of results */
}

【讨论】:

  • facepalm 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2011-09-08
相关资源
最近更新 更多