我猜是一个非常基本的问题:
调用lua的C++代码如下所示:
lua_State* m_L;
m_L = lua_open();
luabind::open(m_L);
luaL_dofile(m_L, "test.lua");
try {
luabind::call_function<void>(m_L, "main");
} catch (luabind::error& e) {
std::string error = lua_tostring(e.state(), -1);
std::cout << error << std::endl;
}
lua_close(m_L);
Run Code Online (Sandbox Code Playgroud)
现在test.lua具有以下内容:
function main()
print "1"
end
Run Code Online (Sandbox Code Playgroud)
执行后,我收到错误:
test.lua:2: attempt to call global 'print' (a nil value)
Run Code Online (Sandbox Code Playgroud)
问题是什么?它与环境有关吗?我认为像print这样的函数是在全局环境中定义的.那为什么没找到?
非常感谢你.
目前我正在开发一个C++项目,我打算在其中嵌入Lua脚本.因此,某些类需要导出到Lua,我想让它更方便,因此我创建了一个模板类:
template <class T>
class ExportToLua {
public:
ExportToLua() {}
~ExportToLua() {}
private:
static int m_registered;
};
template <class T> int ExportToLua<T>::m_registered = T::exportToLua();
Run Code Online (Sandbox Code Playgroud)
现在每一个需要导出类源自ExportToLua<T>与T="之类要导出".例:
class Example: public ExportToLua<Example> {
public:
Example();
virtual ~Example();
static int exportToLua();
private:
};
Run Code Online (Sandbox Code Playgroud)
Example静态成员函数在哪里exportToLua()保存特定于类的注册码.我的理解是ExportToLua<T>::m_registered每个编译单元都存在一个静态成员变量的实例- 即每个编译单元T.
但是当我启动我的程序时,注册码永远不会被调用.例如在example.cpp中:
int Example::exportToLua() {
std::cout << "int Example::exportToLua()" << std::endl;
return -2;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行程序时,我从未看到此消息.
知道为什么吗?编译器是否"优化了"静态变量m_registered,因为我没有在任何地方使用它?
感谢您的输入,
最好的,克里斯托弗
我正在研究一个基本上只执行lua脚本的c ++程序.在那个lua脚本中,然而构造了类,这些类已经从我的c ++程序导出到lua脚本.
我的main()c ++函数只是在做了一些准备之后调用了...
luabind::call_function<void>(m_L, "main");
Run Code Online (Sandbox Code Playgroud)
现在我的lua脚本看起来像这样
local function test()
local c = C()
end
function main()
for i=1,2 do
log(i)
test()
end
end
Run Code Online (Sandbox Code Playgroud)
我已经包含了一个std :: cout <<"析构函数"<< std :: endl; 在C的析构函数中所以我知道它什么时候被调用.我希望lua的垃圾收集在每次执行test()时都会调用c的析构函数,因为那时它就超出了范围.相反,我看到以下输出:
1
2
destructor
destructor
Run Code Online (Sandbox Code Playgroud)
而不是
1
destructor
2
destructor
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样?我在这里错过了什么吗?