c++ - 为嵌入式 Lua 脚本设置 'environment'

标签 c++ scripting lua

我在 C++ 应用程序中嵌入了一个 Lua 解释器。

我想为运行脚本设置一个“环境”,以便所有脚本都可以使用某些变量。

例如,我想将只读对象 Foo 和 FooBar 公开给脚本,这样 Foo 和 FooBar 可用于所有正在运行的脚本。

有谁知道我该怎么做?展示如何做到这一点的片段将非常有用。

最佳答案

我没有听说过 Lua 中的只读变量,但您可以通过函数调用使环境可用来防止修改。

如果 C++ 应用程序很大,您可能希望使用工具来生成可以从 Lua 调用的接口(interface)。我过去曾幸运地使用过 tolua++:

假设demo.hpp是C++应用程序的头文件:

#ifndef SO_DEMO_HPP
#define SO_DEMO_HPP

namespace demo
{
    class Foo
    {
        double x;

    public:
        Foo(double x) : x(x) {}
        double getX() const { return x; }
    };

    Foo* getFoo();
}

#endif

demo.cpp 中实现 demo::getFoo()

demo.pkg 列出了应该可以从 Lua 调用的东西:

$#include "demo.hpp"

namespace demo
{
    class Foo
    {
        double getX() const;
    };

    Foo* getFoo();
}

生成包含我们的 Lua 模块的 demo_stub.cppdemo_stub.hpp 文件:

$ tolua++5.1 -o demo_stub.cpp -H demo_stub.hpp demo.pkg

main.cpp 是加载demo模块的Lua解释器:

#include "demo.hpp"

extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <tolua++.h>
}
#include "demo_stub.hpp"

int main()
{
    lua_State *L = lua_open();

    luaL_openlibs(L);
    tolua_demo_open(L);

    if (luaL_dofile(L, NULL) != 0)
        fprintf(stderr, "%s\n", lua_tostring(L, -1));

    lua_close(L);
    return 0;
}

tolua_demo_open()函数由tolua++生成,在demo_stub.hpp中声明。

构建一个名为demo的Lua解释器:

$ g++ -I/usr/include/lua5.1 demo.cpp demo_stub.cpp main.cpp -ltolua++5.1 -llua5.1 -o demo

构造一个demo.lua脚本

print("Hello, world!")
print(tolua.type(demo.getFoo()))
print(demo.getFoo():getX())

并将脚本提供给解释器:

$ ./demo < demo.lua
Hello, world!
demo::Foo
42

关于c++ - 为嵌入式 Lua 脚本设置 'environment',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4482518/

相关文章:

c++ - 在对的 vector 中按关键字查找对

c++ - CMake:如何在安装了 VS2017 的情况下指定 VS2015.3 工具集

perl - 如何跟踪远程文件?

c - 从 C 访问 Lua 子表字段

lua - Lua中的相对文件路径?

c++ - 如何使用初始化列表构造 std::array 对象?

c++ - 如何连接到蓝牙低功耗设备

windows - 在批处理脚本中获取父目录的名称

linux - 在循环中使用两个变量来访问同一文件夹中的两种不同文件类型shell脚本linux

lua - 电晕写入文件