lua_pushcfunction到栈里再通过lua_setglobal取出注册到_G表里或者通过 使用lua_rawsetfield/lua_setfield注册到特定的表里 1.函数注册到全局环境的方式 无参函数 代码语言:cpp 代码运行次数:0 运行 AI代码解释 #include<stdio.h>#include<lua.hpp>extern"C"{// 一个Lua函数
1); /* 获取一个参数 */ lua_pushnumber(L, sin(d)); /* 将结果压入栈 */ return 1; /* 返回结果的数目 */ } 假如我们使用pushcfunction将这个函数压入栈并使用lua_setglobal给它设置一个名称叫my_sin,那么在注册之后在Lua中可以这样使用: a=my_sin(2) Lua调用这个函数...
所有可被lua调用的函数型为 typedef int (*lua_Cfunction)(lua_State*L) 例如 static int l_sin(lua_State *L) { double d = lua_tonumber(L,1); lua_pushnumber(L,sin(d)); return 1; } 1. 2. 3. 4. 5. 6. 7. 其中返回值是其压入栈的函数返回值的数量 2.然后将函数置入栈中 lua_pu...
lua_pushnumber(l, max(num1, num2)); return 1; } 3.注册成C函数 lua_pushcfunction(L, l_max); lua_setglobal(L,"mymax"); 4.Lua中调用(test.lua) d = mymax(340,37);io.write(d) 完整的C函数 #include"lua.h"#include"lualib.h"#include"lauxlib.h"double max(double a, double b)...
lua_pushstring(lua_State* L, const char* s) 说明:将一个 C 字符串(以空字符结尾的字符串)压入堆栈。 参数: L:Lua 状态(Lua 虚拟机实例)的指针。 s:要压入堆栈的 C 字符串。 最佳实践:使用该函数将 C 字符串压入堆栈,可以供 Lua 脚本使用。
在编写用于Lua的C函数时,我们可能需要一些类似于面向对象的能力,比如我们想在Lua中使用象这样的一个计数器类: struct CCounter{ CCounter() :m_(0){} int count(){ return ++i; } private: int m_; }; 这里如果我们仅仅使用lua_pushcfunction提供一个count函数已经不能满足要求(使用static? 不行,这样...
2. int lua_pcall(lua_State *L, int narg, int nresults, int errfunc);:这个函数与lua_call类似,但它还允许设置错误处理函数,如果函数调用失败,Lua会调用这个函数处理错误。3. lua_pushcfunction(lua_State *L, lua_CFunction f);:将C函数压入栈中,以便在Lua中调用。4. lua_register...
lua_pushinteger(L, a+b); return 1; } 每一个Lua注册的函数都必须是这个原型,它已经在lua.h中定义了: typedef int (*lua_CFunction) (lua_State *L); 由于c函数返回了一个int类型的返回值个数。因此,当压入返回值之前,不必要清理栈,lua会自动移除返回值下面的任何数据。
// lua_register 是 Lua C API 中的一个宏,用于将 C 函数注册为 Lua 全局函数 /* 这个宏实际上是 lua_pushcfunction 和 lua_setglobal 两个函数的组合: lua_pushcfunction(L, f):将 C 函数 f 压入 Lua 堆栈。 lua_setglobal(L, n):将堆栈顶部的值(即刚刚压入的 C 函数 f)设置为全局变量 n...
Lua使用upvalue机制实现了局部静态变量和C闭包的效果: function F1(n) local function F2() print(n) end return F2 end g=F1(5) g() 这个是Lua代码,结果是5,这里要注意一件事,按道理说g=F1(5)之后n应该已经结束它的使命了,然而再次执行g()也就是F2发现输出是5,这说明n并没有在F1执行完成后被销毁,...