博客
关于我
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/

你可能感兴趣的文章
MySQL多表左右连接查询
查看>>
mysql大批量删除(修改)The total number of locks exceeds the lock table size 错误的解决办法
查看>>
mysql如何做到存在就更新不存就插入_MySQL 索引及优化实战(二)
查看>>
mysql如何删除数据表,被关联的数据表如何删除呢
查看>>
MySQL如何实现ACID ?
查看>>
mysql如何记录数据库响应时间
查看>>
MySQL子查询
查看>>
Mysql字段、索引操作
查看>>
mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
查看>>
mysql字段类型不一致导致的索引失效
查看>>
mysql字段类型介绍
查看>>
mysql字段解析逗号分割_MySQL逗号分割字段的行列转换技巧
查看>>
MySQL字符集与排序规则
查看>>
MySQL字符集乱码
查看>>
mysql字符集设置
查看>>
mysql存储IP地址的数据类型
查看>>
mysql存储中文 但是读取乱码_mysql存储中文乱码
查看>>
MySQL存储引擎
查看>>
MySQL存储引擎
查看>>
MySQL存储引擎--MYSIAM和INNODB引擎区别
查看>>