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_State lua_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.lua luaL_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)
Lua 与C/C++ 交互系列: Lua调用C/C++函数(3)
原文地址:http://blog.csdn.net/sunning9001/article/details/46576271