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
原创粉丝点击