从string_t调用Lua函数

3

我有一些在.lua文件中声明和初始化的函数。然后,当我收到信号时,我会从文件中读取名为string_t的变量,该变量包含要调用的函数的名称。问题是我不知道如何通过函数名称将函数推入堆栈或调用它。

例如:

test.lua

function iLoveVodka()
    --some text
end

function iLoveFish()
    --another text
end

C文件:

string_t a = "iLoveVodka()"

我如何仅通过函数名从C/C++代码中调用函数iLoveVodka()


将其推入堆栈,然后调用 lua_pcall - Appleshell
@Appleshell,我需要使用哪个函数将其推入堆栈? - VIRUS
2
如果它是一个全局函数,可以使用 lua_getglobal(state, "iLoveVodka");,或者将其名称推送到堆栈上并调用 lua_getfield。(不要害怕在 http://www.lua.org/manual/5.1/#index 上探索) - Appleshell
1
此外,如果您有一段可运行的代码块(例如 iLoveVodka()),而不仅仅是函数名称,则可以使用 luaL_dostring 或其周围的宏函数来运行该代码块。 - Etan Reisner
1个回答

1

这里是一些示例代码,它可以完成两件事情:

  • 从相同目录加载文件“test.lua”。
  • 尝试调用函数iLoveVodka()(如果找到的话)。

您应该可以很容易地构建它:

  #include <lua.h>
  #include <lauxlib.h>
  #include <lualib.h>
  #include <stdio.h>
  #include <stdlib.h>


   int main( int argc, char *argv[])
   {
      lua_State *l = luaL_newstate ();
      luaL_openlibs (l);

      int error = luaL_dofile (l, "test.lua");
      if (error)
      {
          printf( "Error loading test.lua: %s\n",luaL_checkstring (l, -1) );
          exit(1);
      }

      /**
       * Get the function and call it
       */
      lua_getglobal(l, "iLoveVodka");
      if ( lua_isnil(l,-1) )
      {
          printf("Failed to find global function iLoveVodka\n" );
          exit(1);
      }

      lua_pcall(l,0,0,0);

      /**
       * Cleanup.
       */
      lua_close (l);

      return 0;
  }

这可以这样编译:

This can be compiled like this:

 gcc -O -o test `pkg-config --libs --cflags lua5.1`  test.c

只需在test.lua文件中定义您的iLoveVodka()函数,您就可以正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接