将C++函数转换成Lua函数

让我们有一个在"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文件中有其他内容,我可以从C++中使用函数foo吗?

原文链接 https://stackoverflow.com/questions/10453549

点赞
stackoverflow用户1306033
stackoverflow用户1306033

如果您需要能够独立运行该函数而不运行该代码,将代码和函数分成两个单独的脚本,一个脚本包含 foo,另一个脚本加载该脚本并测试 foo

只有执行包含它的脚本后,函数才被定义。执行该脚本将定义 foo,然后运行另外三行。

当您使用loaL_loadfile(或任何其他加载调用)加载文件时,整个脚本将转换为一个函数。要执行它,您必须调用该函数,使用lua_pcall或其他方法。在那之前,定义 foo 的脚本只是一个未命名的未执行代码块。

没有函数可以执行脚本的部分内容,或仅执行函数定义。

2012-05-04 17:42:32
stackoverflow用户501459
stackoverflow用户501459

我可以在 lua 文件里使用 C++ 函数 foo 吗?即使 lua 文件里还有其他代码?

可以。

但是如果没有执行 lua 文件中其他部分,你能否使用它呢? 不行。

Lua 函数是在运行时定义的。仅仅加载和编译脚本是不够的,你必须运行结果的 chunk 才能在 Lua 状态下定义函数 foo

2012-05-04 19:56:35