2014-06-16 61 views
3

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

例如:

test.lua

function iLoveVodka() 
    --some text 
end 

function iLoveFish() 
    --another text 
end 

C语言文件:

string_t a = "iLoveVodka()" 

我怎么能只有具备它的名字叫从C/C++代码iLoveVodka()功能?

+0

将它推入堆栈,然后调用'lua_pcall' – Appleshell

+0

@Appleshell我必须使用哪个函数将它推入堆栈? – VIRUS

+2

如果它是一个全局函数,则可以使用'lua_getglobal(state,“iLoveVodka”);'或者将其名称放在堆栈上并调用'lua_getfield'。 (不要害怕探索http://www.lua.org/manual/5.1/#index) – Appleshell

回答

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

这可以被编译如下:

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

只要定义里面test.luaiLoveVodka()功能,你应该确定。