`
alienchang
  • 浏览: 31606 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Lua C库编程的一些心得

    博客分类:
  • Lua
阅读更多
    在对Lua语言进行C扩展的时候,注意一个最最重要的就是,关键在于Lua那个栈的管理,对参数的接收和返回都是通过那个栈来实现的,所以一定要深刻理解它的栈管理,有些函数如lua_newuserdata会push到栈上,有些函数会pop如luaL_ref,有些函数只取值并不改变栈状态如luaL_checkstring,随时注意栈状态的变化,这个我们可以用lua_gettop函数来观察栈顶变化来估计栈中的内容,lua和C结合在lua中调试很恶心,只能通过printf来估计
    1、关于Lua接口的导出:
    lua是通过在C DLL中export一个luaopen_LUAMODALNAME函数来实现这个导出的,注意那个LUAMODALNAME是你导出的库名,然后需要做的是在这个函数用luaL_openlib 、luasql_set_info或luaL_register来注册打开要导出的函数,这些函数的第三个参数都是一个类似lua table结果的数组,理解了lua栈的工作原理就知道为什么是这个样子的,示例如下:
extern "C" int LURL_API luaopen_lurl(lua_State* L)
{
        const luaL_Reg mylib[] =
{
	{"escape", escape},
	{"deescape", deescape},
	{NULL, NULL}
};
	//lua_register(L, "escape",  escape); //使用lua_register注册函数 
	//lua_register(L, "deescape",  deescape); //使用lua_register注册函数 
	luaL_register(L, "lurl", mylib);
	return 1;
}

     这样在lua中调用require'mylib'时就能打开这个modal了,注意:如果register一个table相当于返回了一个table,然后可以mylib.escape这来调用,而如果register一个函数的话就相当于注册了一个全局函数,直接escape这样调用就行了
LUASQL_API int luaopen_luasql_oci8 (lua_State *L) {
	struct luaL_reg driver[] = {
		{"oci8", create_environment},
		{NULL, NULL},
	};
	create_metatables (L);
	luaL_openlib (L, LUASQL_TABLENAME, driver, 0);
	luasql_set_info (L);
	return 1;
}

    这样在lua中调用require'luasql.oci8'时就能打开这个modal了(注意放到luasql文件夹里才行),然后调用luasql.oci8()时它就会调用create_environment函数了

    2、关于metatable实现:
    使用luasql_createmeta来创建一个metatable如下:
struct luaL_reg statement_methods[] = {
		{"close", stmt_close},
		{"bind_number", stmt_bind_number},
		{"bind_string", stmt_bind_string},
		{"bind_cursor", stmt_bind_cursor},
		{"execute", stmt_execute},
		{NULL, NULL}
	};
luasql_createmeta (L, LUASQL_STATEMENT_OCI8, statement_methods);


    3、关于userdata实现:
    首先lua_newuserdata来新建一个userdata这时它会把这个结果push到栈顶,然后你可以通过 luasql_setmeta来设置它的metatable,或者直接初始化返回,这时结构已经在栈中,return 1通知lua环境你要返回一个返回值就行

    4、关于table的返回:
    有两种方式:1、用lua_createtable来自己创建一个table  2、传入一个空table然后填充然后通过lua_pushvalue复制到栈顶返回(参考luasql中cur_fetch的实现)
填充过程也有两种方式:
    1.)通过void lua_rawseti (lua_State *L, int index, int n);,这种方式是从栈顶淡出value,然后实现t[n] = v 的操作
    2.)通过 lua_rawset 或 lua_settable,这种方式是自定义key的实现,lua先从栈中先弹出key,然后弹出值,实现一个 t[k] = v
分享到:
评论

相关推荐

    进行C++与LUA交互编程的LUA库

    - **luaL_openlibs**:打开LUA标准库,提供了一些基本的数学、字符串、表等操作功能。 - **luaL_loadbuffer/luai_apicheck**:加载并编译LUA脚本,或者检查LUA API的调用是否正确。 - **lua_pcall**:调用LUA函数...

    易语言LUA支持库1.0#0版(第三方)

    LUAC函数操作(命令分类)。这是一组全局函数,当您在您的应用程序中实现一个能被LUA调用的函数时候,需要用到这些函数。主要是数据交换相关。包含 LUA取参数数目、LUA取参数类型、LUA取参数值、LUA加返回值、LUA...

    luajava最新源码+jar包+动态链接库+lua编程环境

    史上最全luajava最新源码+jar包+动态链接库+lua编程环境 史上最全luajava最新源码+jar包+动态链接库+lua编程环境 史上最全luajava最新源码+jar包+动态链接库+lua编程环境

    Lua 编程指南-Lua 编程入门教程

    ### Lua编程指南—Lua编程入门教程 #### 一、Lua简介及特点 Lua是一种轻量级的、高效的脚本语言,常被用作C语言的功能扩展。它具有以下特点: - **简洁优雅**:Lua的设计理念是简洁和优雅,这使得它的语法非常...

    lua socket库

    Lua Socket库是一个强大的扩展库,它为Lua编程语言提供了网络通信功能,特别是HTTP协议的支持。这个库是由Diego Nehab开发的,它使得在Lua中编写网络应用变得更加简单和高效。Lua Socket库不仅包含了基本的套接字...

    LUA脚本|LUA脚本支持库

    开发LUA扩展库通常涉及C/C++编程,因为LUA的C API允许创建新的全局变量、函数和类型。开发者可以利用这些API创建自定义的模块,然后用`luaL_register`或`lua_register`将它们注册到LUA全局环境。 6. LUA与宿主语言...

    LUA扩展支持库

    1. **Lua C API**:Lua是用C语言实现的,因此提供了一个C接口供开发者用C或C++编写扩展模块。通过这个接口,你可以定义新的全局函数、创建新的数据类型、甚至实现全新的编程概念。例如,`luaL_newmetatable`用于创建...

    lua扩展库V1.51

    《lua扩展库V1.51》是针对lua编程语言的一个功能丰富的库集合,它为lua程序员提供了更多元化的操作工具,特别是在硬件控制和数据处理方面。以下将详细阐述其中的一些核心库及其功能: 1. **bit库**: - `bit`库是...

    Lua支持库.rar

    4. **示例脚本**:可能包含一些示例 Lua 脚本,演示如何在易语言中使用这些库,帮助开发者快速上手。 5. **文档说明**:可能包含关于如何集成和使用 Lua 支持库的文档,这对于开发者理解和应用这些库至关重要。 6....

    lua支持库完美版终极版

    《易语言LUA1.1:游戏开发中的强大支持库》 在计算机编程的世界里,易语言和Lua是两种极具特色的编程语言。...通过下载提供的“lua支持库1.1版”,你将开启易语言与Lua结合的全新编程旅程,探索无限可能。

    LUAC脚本解密_luac解密在线_luac4加密_luac反编译_luac4解密工具_luac解密工具

    "luac4加密"指的是LUAC的特定版本——LUAC 4,它可能包含了一些特定的加密机制,以防止非授权的访问或修改。加密LUAC脚本可以保护代码不被轻易读取和篡改,但同时也增加了解密的难度。 "luac反编译"是指将LUAC字节...

    Lua 静态库,编译器(含32位和64位)

    Lua 静态库,编译器(含32位和64位),编译好的静态库,以及编译好的Luac.exe,都有32位和64位版本,使用请包含include下面的lua.hpp,在加入lib库即可使用!版本为lua5.2.1!

    linux环境中c++调用lua动态链接库以及编译方法

    Lua是一个轻量级的脚本语言,它的动态链接库允许C/C++程序直接嵌入和调用Lua函数。在Linux系统中,动态链接库通常以`.so`为后缀,代表"shared object"。`liblua.so`包含了Lua的运行时环境和核心API,供C++代码使用。...

    lua扩展库V1.6

    上述内容涵盖了lua扩展库V1.6的主要功能和用法,通过这些扩展库,Lua语言的应用范围得到了极大的扩展,可以被广泛应用于嵌入式系统开发、网络编程、数据处理、信号处理等领域。使用这些扩展库能够帮助开发者以更加...

    lua库说明和一些例程

    这个压缩包文件包含了关于Lua库的详细说明以及一些实际的例程,可以帮助我们更深入地理解和应用Lua语言。 首先,我们要理解的是 Lua 的元表(Metatables)。在 Lua 中,元表是一种特殊的数据结构,它可以关联到任何...

    Lua程序_创建一个VC6的静态库工程

    在本文中,我们将深入探讨如何在Microsoft Visual C++ 6.0(简称VC6)环境中为Lua编程语言创建一个静态库工程。Lua是一种轻量级的脚本语言,以其简洁的语法、强大的元编程能力以及易集成性而受到广泛欢迎。在VC6中...

    Lua脚本支持库

    以上就是关于“Lua脚本支持库”的一些关键知识点,它们扩展了Lua的功能,使开发者能够在更广泛的领域内使用Lua进行开发。压缩包中的“梦优勿扰Lua支持库源码及例子静态版mLuafne”可能包含了上述某些库的实现或特定...

    lua库和解析器

    例如,你可以使用lua.exe测试和运行单个Lua脚本,用luac.exe将脚本编译为字节码,然后在主程序中通过lua51.dll加载和执行这个预编译的脚本。这样既保证了运行效率,也方便了开发流程。 总的来说,Lua库和解析器是...

    LUA编程高清版

    - **与C/C++相比**:LUA的语法更简洁,易于学习,但C/C++提供了更底层的控制能力。 - **与Java相比**:Java有更强的类型安全性和丰富的类库支持,而LUA则更加灵活和轻便。 - **与Python相比**:Python的语法更为直观...

    c++ lua封装库包含演示和库代码

    C++封装Lua库的核心在于使用Lua提供的C API,这包括luaL_newstate、luaL_openlibs、luaL_loadbuffer或luaL_loadfile等函数来创建和管理Lua状态机,以及lua_pcall、lua_gettop、lua_settop等函数进行函数调用和栈操作...

Global site tag (gtag.js) - Google Analytics