您的位置:首页 > 编程语言 > Lua

Lua 与C/C++ 交互系列: Lua调用C/C++函数(3)

2015-06-20 23:01 447 查看
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)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: