来自 C++ 的 Lua 函数

lua function from c++

本文关键字:函数 Lua C++ 来自      更新时间:2023-10-16

让我们在"luafunc.lua"中有一个代码:

function foo(a, b)
   return a + b
end
a = io.read('*n')
b = io.read('*n')
print (foo(a, b))

让我们尝试使用C++文件中的函数 foo:

#include <iostream>
using namespace std;
extern "C"{
    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
};
int main()
{
    lua_State *lvm = lua_open();
    luaL_openlibs(lvm);
    luaL_loadfile(lvm, "luafunc.lua");
    int a, b;
    cin >> a >> b;
    lua_pcall(lvm, 0, LUA_MULTRET, 0);
    lua_getglobal(lvm, "foo");
    lua_pushnumber(lvm, a);
    lua_pushnumber(lvm, b);
    if (lua_pcall(lvm, 2, 1, 0))
    {
        cout << "Error: " << lua_tostring(lvm, -1) << endl;
        return 0;
    }
    cout << "The result is: " << lua_tonumber(lvm, -1) << endl;
    lua_close(lvm);
    return 0;
}

所以,问题是这个C++代码执行整个luafunc.lua。当然,我可以从lua文件中删除读取部分,然后从C++中仅执行foo。但是即使 lua-file 中有其他东西,我也可以使用 C++ 中的函数 foo 吗?

如果您需要能够在不运行该代码的情况下使用该函数,请将代码和函数分成两个单独的脚本,一个包含foo的脚本和一个加载该脚本并测试foo的脚本。

执行包含函数的脚本之前,不会定义函数。执行该脚本将定义foo,然后运行其他 3 行。

当你用loaL_loadfile加载文件(或任何其他加载调用)时,整个脚本会变成一个函数;要执行它,你必须调用该函数,使用lua_pcall或其他任何东西。 在此之前,定义 foo 的脚本只是堆栈上一个未命名、未执行的代码块。

没有函数可以只执行

脚本的一部分,或者只执行函数定义。

即使 lua-file 中有其他内容,我也可以使用 C++ 中的函数 foo 吗?

是的。

您可以在不执行该文件的其他部分的情况下使用它吗?不。

Lua 函数在运行时定义。仅仅加载和编译该脚本是不够的,您必须运行生成的块才能在Lua状态下定义foo