0

Let we have a code in "luafunc.lua":

function foo(a, b)
   return a + b
end

a = io.read('*n')
b = io.read('*n')
print (foo(a, b))

Let's try to use function foo from C++ file:

#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;
}

So, the problem is that this C++ code executes the whole luafunc.lua. Naturally I can remove reading part from lua-file and then from C++ only foo is executed. But can I use function foo from C++ even if there's other stuff in lua-file?

4

2 回答 2

4

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

在执行包含它的脚本之前,不会定义一个函数。执行该脚本将定义foo并运行其他 3 行。

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

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

于 2012-05-04T17:42:32.810 回答
3

即使 lua 文件中有其他东西,我可以使用 C++ 中的函数 foo 吗?

是的。

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

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

于 2012-05-04T19:56:35.957 回答