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