lua编程 C调用lua

lua编程 C调用lua

在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代码更新程序,也可以给用户提供一个自由定制的接口,这种方法遵循了机制与策略分离的原则。

Lua与C相互调用的首要问题是如何交换数据,lua API使用了一个抽象的栈与C语言交换数据,提供了压入元素查询元素弹出元素等功能的API操作栈,这里可以查看lua5.2中每个函数的详细文档,栈中的元素可以通过索引访问,从栈底向上是从1开始递增的正整数从栈顶向下是从-1开始递减的负整数,栈的元素按照FIFO的规则进出。

1. C调用lua 变量

先通过一个简单的例子了解C是怎么调用lua的,

//test.lua

// 变量
width = 10
height = 20

//test.c
#include 
#include 
#include 
#include 

int main() {
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);

  if(luaL_loadfile(L, "test.lua") || lua_pcall(L, 0,0,0)){
    printf("error %s
", lua_tostring(L,-1));
    return -1;
  }
  lua_getglobal(L,"width");
  lua_getglobal(L,"length");
  printf("width = %d
", lua_tointeger(L,-2));
  printf("length = %d
", lua_tointeger(L,-1));
  lua_close(L);
  return 0;
}

uaL_newstate创建一个新的lua_State,C和lua的所有操作都要依赖这个lua环境

luaL_openlibs将lualib.h中定义的lua标准库加载到进lua_State。

luaL_loadfile从文件中加载lua代码并编译,编译成功后的程序块被压入栈中,

lua_pcall会将程序块弹出并在保护模式下解释执行。代码中调用lua_pcall就在lua_State中定义了 width和 length两个全局变量。

lua_getglobal将全局变量的值压入栈中,width先入栈,在-2的位置,length在栈顶。

2. C调用lua函数

//test.lua
function add(x, y)
  return x+y
end
//test.c
#include 
#include 
#include 
#include 
#include 

int main() {
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);

  if(luaL_loadfile(L, "test.lua") || lua_pcall(L, 0,0,0)){
    printf("error %s
", lua_tostring(L,-1));
    return -1;
  }
  lua_getglobal(L,"add");
  lua_pushnumber(L, 10);
  lua_pushnumber(L, 20);
  if(lua_pcall(L, 2, 1, 0) != 0){
    printf("error %s
", lua_tostring(L,-1));
    return -1;
  }
  double z = lua_tonumber(L, -1);
  printf("z = %f 
", z);
  lua_pop(L, 1);
  lua_close(L);
  return 0;
}

lua_pcall(L, 2, 1, 0)表示,传入两个参数,期望得到一个返回值,0表示错误处理函数在栈中的索引值,压入结果前会弹出函数和参数,所以z的索引是-1.

你可能感兴趣的:(笔记,lua,c语言,开发语言)