博客
关于我
Lua自定义userdata(与C++对象绑定)
阅读量:685 次
发布时间:2019-03-17

本文共 2221 字,大约阅读时间需要 7 分钟。

userdata是lua提供给开发者自定义C/C++数据结构的一套api,他能够在C/C++层映射内存空间,使我们的程序能够更加的灵活。下面我就来介绍一下userdata是如何绑定C/C++对象的。

首先定义构造函数如下

#define HTTP_REQUEST_META_NAME 			"HttpRequest"class HttpRequestWrapper {   public:	HttpRequestWrapper(const char*bind,const char*host, int port){   	}	static int create(lua_State* L) {   		const char* bind = lua_tostring(L, 2);		const char* host = lua_tostring(L, 3);		int port = (int) lua_tointeger(L, 4);		w = new HttpRequestWrapper(bind,host,port);		if (w == NULL)			goto FAIL;		void **u = (void**) lua_newuserdata(L, sizeof(void*));		if (!u)			goto FAIL;		*u = w;		luaL_getmetatable(L, HTTP__META_NAREQUESTME);		lua_setmetatable(L, -2);		return 1;		FAIL: {   			printf("HttpRequest::create> failed!");			return 0;		}	}

之后我们要给他定义一个gc函数,好让lua虚拟机自动回收内存

static int __gc(lua_State* L) {   		void **s = (void**) luaL_checkudata(L, 1, HTTP__META_NAREQUESTME);		if (*s == NULL)			return NULL;		luaL_argcheck(L, s != NULL, 1, "invalid user data");		HttpRequestWrapper ret = (HttpRequestWrapper*) (*s);        if(ret != NULL){   			delete ret ;			*s = NULL;		}		return 0;	}

我们再给他定义一个打印函数,验证userdata是否建立成功

static int print(lua_State *L) {          	void **s = (void**) luaL_checkudata(L, 1, HTTP__META_NAREQUESTME);		if (*s == NULL)			return NULL;		luaL_argcheck(L, s != NULL, 1, "invalid user data");		HttpRequestWrapper ret = (HttpRequestWrapper*) (*s);		if (ret  != NULL) {   			printf("HttpRequest::print>...0");			const char *str = lua_tostring(L, 2);			printf("HttpRequest::print> %s", str);		}		return 0;	}

最后我们要讲自定义的userdata注册到lua虚拟机中

static const struct luaL_Reg http_request_lib_f[] = {   	{    "create", HttpRequestWrapper::create },	{    NULL, NULL } };static const struct luaL_Reg http_request_lib_m[] = {   	{    "__gc", HttpRequestWrapper::__gc },	{    "print", HttpRequestWrapper::print },	{    NULL, NULL }};static int luaopen_http_request(lua_State *L) {   	luaL_newmetatable(L, HTTP_REQUEST_META_NAME);	lua_pushvalue(L, -1);	lua_setfield(L, -2, "__index");	luaL_setfuncs(L, http_request_lib_m, 0);	luaL_newlib(L, http_request_lib_f);	return 1;}

于是乎我们就可以在lua中使用自定义的userdata了

local bind = ‘any’local host,port = ‘127.0.0.1’,8081local h = HttpRequest:create(bind, host, port)h:print(‘aaaaaaaaaaaaaa’)

转载地址:http://vbvhz.baihongyu.com/

你可能感兴趣的文章
Node.js 之 log4js 完全讲解
查看>>
Node.js 函数是什么样的?
查看>>
Node.js 函数计算如何突破启动瓶颈,优化启动速度
查看>>
Node.js 切近实战(七) 之Excel在线(文件&文件组)
查看>>
node.js 初体验
查看>>
Node.js 历史
查看>>
Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
查看>>
Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
查看>>
Node.js 异步模式浅析
查看>>
node.js 怎么新建一个站点端口
查看>>
Node.js 文件系统的各种用法和常见场景
查看>>
Node.js 模块系统的原理、使用方式和一些常见的应用场景
查看>>
Node.js 的事件循环(Event Loop)详解
查看>>
node.js 简易聊天室
查看>>
Node.js 线程你理解的可能是错的
查看>>
Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
查看>>
node.js 配置首页打开页面
查看>>
node.js+react写的一个登录注册 demo测试
查看>>
Node.js中环境变量process.env详解
查看>>
Node.js之async_hooks
查看>>