Lua 与C/C++ 交互系列: Lua调用C/C++函数(3)
来源:互联网 发布:mac返回桌面 编辑:程序博客网 时间:2024/04/29 21:03
1、Lua API中提供注册C函数关键在lua_pushcclouse()函数。该函数可以在Lua Code中定义C函数。 但是Lua 提供了几个常用的宏定义,用于注册C函数。
这几个宏定义为:
/#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
LUALIB_API void luaL_openlib (lua_State *L, const char *libname, const luaL_Reg *l, int nup)
LUALIB_API void (luaL_register) (lua_State *L, const char *libname, const luaL_Reg *l)
提供的宏定义和拓展库,主要为了方便在全局变量中注册C函数和注册整个C模块。
#include <iostream>using namespace std;extern "C" {#include "lua.h"#include "lauxlib.h"#include "lualib.h"}//在Lua Code中注册的函数int sum_zero(lua_State *L){int top =lua_gettop(L);int sum =0;for(size_t t=top;t>0;t--){int lnum =lua_tonumber(L,t); sum+=lnum;}lua_pushnumber(L,sum);return 1;}//1、在Lua API中提供几个常用的宏用来注册C函数。//#define lua_pushcfunction(L,f)lua_pushcclosure(L, (f), 0)//该宏定义为零个upvalues.该宏定义仅仅对lua_pushcclosure()简单封装。void register_sum_zero(lua_State *L){ lua_settop(L,0); int n =0;lua_pushcfunction(L,sum_zero);lua_setglobal(L,"sum_zero");}int sum_deprecated(lua_State *L){int top =lua_gettop(L);int sum =0;for(size_t t=top;t>0;t--){int lnum =lua_tonumber(L,t); sum+=lnum;}lua_pushnumber(L,sum);return 1;}//2.lua_register(L,n,f) 宏定义在全局变量中定义函数。但是在5.2中已经不再建议使用。//#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))//在全局变量中直接注册C函数void register_sum_deprecated(lua_State *L){ lua_settop(L,0); //在全局变量中注册C函数的宏定义 //该宏定义已经不在建议使用lua_register(L,"sum_deprecated",sum_deprecated);}//在Lua Code中注册的函数int sum_userlib(lua_State *L){int top =lua_gettop(L);int sum =0;for(size_t t=top;t>0;t--){int lnum =lua_tonumber(L,t); sum+=lnum;}lua_pushnumber(L,sum);return 1;}//3.LUALIB_API void luaL_openlib (lua_State *L, const char *libname, const luaL_Reg *l, int nup)//在Lua 中注册整个C模块.upvalues数量为零void register_sum_lib(lua_State *L){ static const luaL_Reg userLib[] = { {"sum", sum_userlib}, {NULL, NULL} }; const char* libname ="userlib"; luaI_openlib(L, libname, userLib, 0);}//在Lua Code中注册的函数int sum_reglib(lua_State *L){int top =lua_gettop(L);int sum =0;for(size_t t=top;t>0;t--){int lnum =lua_tonumber(L,t); sum+=lnum;}lua_pushnumber(L,sum);return 1;}//LUALIB_API void (luaL_register) (lua_State *L, const char *libname, const luaL_Reg *l)//{ //luaI_openlib(L, libname, l, 0);//}//注册整个C模块void register_reglib(lua_State *L){ static const luaL_Reg reglib[] = { {"sum", sum_reglib}, {NULL, NULL} }; const char* libname ="reglib"; luaL_register(L, libname, reglib);} int main(int argc, char **argv){ //创建lua_Statelua_State *L = lua_open(); /* create state *///注册标准库luaL_openlibs (L);//通过push_cfunction宏定义来注册C函数register_sum_zero(L);//通过lua_register(L,n,f)在全局变量中注册C函数register_sum_deprecated(L);//注册整个C模块,upvalue数量可选择register_sum_lib(L);//注册整个C模块,upvalue数量为零register_reglib(L);//执行sample_4.lualuaL_dofile (L, "sample_4.lua");lua_close(L);return 1;}
在Lua 中调用定义的全局函数和模块中的函数:
print("sample_4.lua")local z =sum_zero(1,2,3,4,5)print("z="..z)local d =sum_deprecated(1,2,3,4,5)print("d="..d)local s=userlib.sum(1,2,3,4,5)print("s="..s)local r =reglib.sum(1,2,3,4,5)print("r="..r)
0 0
- Lua 与C/C++ 交互系列: Lua调用C/C++函数(3)
- Lua 与C/C++ 交互系列:通过C调用Lua函数(1)
- Lua 与C/C++ 交互系列: Lua调用C/C++函数(1).
- Lua 与C/C++ 交互系列: Lua调用C/C++函数(2).
- Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-1)
- Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-2)
- Lua 与C/C++ 交互系列:通过C++调用Lua函数(2)
- 【Lua】Lua与C交互
- Lua 与C交互
- Lua 与 C 交互
- Lua 与C交互
- Lua 与C交互
- Lua 与C交互
- Lua 与 C 交互
- lua与c交互
- C与lua交互
- Lua与C交互
- lua与c交互
- ORA-00918 column ambiguously defined
- 自我简绍
- C++中生成任意范围内随机数的方法
- java中自带的对于自定义的类的排序
- 选择排序
- Lua 与C/C++ 交互系列: Lua调用C/C++函数(3)
- C#中序列化的应用
- ubuntu arm软件开发环境配置
- leetcode--Add and Search Word - Data structure design
- C# 闭包
- LeetCode Course Schedule II
- 安装Ubuntu
- mysql测试工具详细介绍
- 数据挖掘导论习题常用数学公式