• 做一个幸福的人,读书,旅行,努力工作,关心身体和心情。
  • 不管有没有人爱,也要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。

Lua 调用 C 函数

Lua编程 lcq 5年前 (2013-08-19) 475次浏览 0个评论

使用Lua调用C函数是我主要要学的知识点。我的主要工作是将C我们工作中用到的基础函数封装成Lua可调用的函数。然后使用Lua语言完成编程。

Lua调用C函数的很有意义。Lua的库函数本身不够丰富,如果能将C的库函数,那么能够极大的简化Lua的编程。这样一来Lua就能够站在C语言巨人的肩膀上。还有一个原因是是有些函数在C语言中比Lua实现简单。对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数。

从 Lua调用C 函数我们必须注册函数,也就是说,我们必须把C 函数的地址以一个适当的方式传递给Lua 解释器。所以,不用怀疑,Lua调用C函数也是通过栈来实现的。当Lua调用C函数的时候,同样使用栈来交互。C函数从栈中获取她的参数,调用结束后将结果放到栈中,并返回放到栈中的结果个数。这儿有一个重要的概念:用来交互的栈不是全局栈,每一个函数都有他自己的私有栈。当Lua调用C函数的时候,第一个参数总是在这个私有栈的index=1的位置。C函数无法直接将真正的返回值返回给Lua代码,而是通过虚拟栈来传递Lua代码和C函数之间的调用参数和返回值的。

对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L)。简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数。返回值是整型,表示该C函数将返回给Lua代码的返回值数量,如果没有返回值,则return 0即可。

下面通过两个简单的实例来说明Lua 是如何调用 C函数的。

C函数作为应用程序的一部分

C语言代码

这样在Lua中就可以使用mod()函数了。比如你想求23 % 6的结果。你只要在Lua代码中print(mod(23, 6))即可。

C函数库成为Lua的模块。

将包含C函数的代码生成库文件,如Linux的so,或Windows的DLL,同时拷贝到Lua代码所在的当前目录,或者是LUA_CPATH环境变量所指向的目录,以便于Lua解析器可以正确定位到他们。在我当前的Windows系统中,我将其copy到”C:Program FilesLua5.1clibs”,这里包含了所有Lua可调用的C库。见如下C语言代码和关键性注释:

Lua代码


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Lua 调用 C 函数
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址