Lua和C语言通信的主要方法是一个无处不在的虚拟栈。几乎所有的API调用都会操作这个栈上的值;所有的数据交换,无论是Lua到C语言或C语言到Lua都通过这个栈来完成。栈可以解决Lua和C语言之间存在的两大差异,第一种差异是Lua使用垃圾收集,而C语言要求显式地释放内存;第二种是Lua使用动态类型,而C语言使用静态类型。
lua中使用C的方式大多数都是通过库文件的形式来实现的,将C函数编译为动态库文件,这样可以在lua主程序中,加载这个库文件,并使用其中的C函数。下面举个简单的例子来说明一下整体的大概流程。 假设要给lua使用的C代码定义在mylib.c中 1)在mylib.c中定义给lua调用的C函数,函数原型一般都是 int (lua_State*) 这...
lua 与 c 语言的交互方式有两种,一种是以 c 语言为主,lua 作为 c 语言调用的一个库,这种方式的 c 代码称为应用程序代码,另一种是以 lua 为主,c 语言作为 lua 调用的一个库,这种方式的 c 代码称为库代码。这两种方式使用同一套 API 来实现,称为 C API。 当lua 与 c 进行交互时,需要用到下面几个...
C 调用 Lua 方法 #include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> int main() { // 1.创建 Lua 状态:首先需要创建一个 Lua 状态,这是 Lua 运行时环境的基础。 lua_State *L = luaL_newstate(); luaL_openlibs(L); // 打开标准库 // 2.加载 Lua 脚本:可...
lua与c之间交互是通过“lua堆栈”通信的。不管是lua调用c还是c调用lua,都是通过操作lua堆栈实现的。顾名思义,lua堆栈也满足后进先出的特点,入栈/出栈都围绕栈顶进行的。与通用的栈不同的是,这个虚拟栈每个位置都对应一个索引,可以通过索引操作指定位置的数据。1代表栈底,向栈顶依次递增;-1代表栈顶,向栈底依次...
Lua和C/C++语言交互的主要方法是一个无处不在的虚拟栈,栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct 堆栈索引的方式可是是正数也可以是负数 正数索引1永远表示栈底,负数索引-1永远表示栈顶 全局表 Lua的全局表可以想象成一个map哈希表结构,比如Lua有一个变量: ...
Lua与C的交互依靠虚拟栈进行 Lua用C写的,使用C++的时候用这个: extern "C" { #include "lua.h" } 所有luaL_开头的函数都是辅助库里的函数,定义在lauxlib.h,所有lua_开头的函数 都定义在lua.h 数据压栈的C函数: void lua_pushnil (lua_State *L); void lua_pushboolean (lua_State *L, int bool);...
这里给出lua_CFunction的类型: typedef int (*lua_CFunction) (lua_State *L); 可以看到它是一个函数指针,可以用于参数是lua_State*而返回值是int的函数。 显然,我们压入栈的C函数的参数和返回值类型是严格受限的。 void lua_setglobal (lua_State *L, const char *name); ...
1.Lua能调用C函数,不是说Lua能调用所有的C函数,就像C调用Lua一样,需要遵守一定的协议,Lua只能调用已经注册的C函数,并且也是通过虚拟栈实现的。 2.注册的C函数需要满足的形式: typedef int (*lua_CFunction) (lua_State *L); 例: double max(double a, double b){ ...
lua 和c的调用 lua中使用c动态库,像luacjson(支持unicode),luasocket,都是以动态链接库的形式在lua中使用的,至于怎么写这些动态链接库很少有教程说到,下面我就说说如何把c文件编译成动态库。 首先,假设需要在lua中调用一个在c中实现的求和函数,函数名add(a,b)。