如何使用Lua扩展C/C++应用系列2

原创 2005年04月23日 10:33:00

作者:buxiu  转自:Lua中文网站(www.luachina.net)

这一篇接着第一个篇"Hello, World!",介绍如何在Lua中定义函数然后在C/C++中调用他,这将涉及到参数传递,返回值,全局变量等。
Lua中定义函数非常简单,以关键字function开头,后面跟上函数名,参数列表,函数体,函数定义以end结尾。Lua中函数可以传递多个参数也可有多个返回值。
下面有个简单的Lua函数,两个数字相加返回两者的和。
-- add two numbers

代码:
function add ( x, y )
    return x + y
    end

在上一篇中我们讲到调用lua_dofile()将加载并运行Lua代码,本节中我们的Lua脚本仅仅定义了一个函数,调用lua_dofile()函数将使得我们的C/C++程序可以访问Lua中的函数了。
Lua中的函数可以接受多个参数,也可以有多个返回值。这是通过stack来完成的。调用一个函数时,首先将函数放到栈顶,接着按顺序放入函数的参数,当我们调用函数lua_call()之后,函数的返回值已经放在栈顶了,这些步骤在下面的luaadd()函数中可以看到。
说明:
1. 调用lua_getglobal()将add()函数压入栈顶。
2. 第一个参数x,通过调用lua_pushnumber()入栈。
3. 再次调用lua_pushnumber()将第二个参数入栈。
4. 使用lua_call()调用Lua函数。
5. 调用lua_tonumber()从栈顶取得函数的返回值。
6. lua_pop()移除栈顶的值。
将下面的代码保存为luaadd.cpp,如果你喜欢用C而不是C++,需要保存文件为luatest.c并且把extern去掉。
代码:
#include <stdio.h>

extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

/* the Lua interpreter */
lua_State* L;

int luaadd ( int x, int y )
{
    int sum;

    /* the function name */
    lua_getglobal(L, "add");

    /* the first argument */
    lua_pushnumber(L, x);

    /* the second argument */
    lua_pushnumber(L, y);

    /* call the function with 2
       arguments, return 1 result */
    lua_call(L, 2, 1);

    /* get the result */
    sum = (int)lua_tonumber(L, -1);
    lua_pop(L, 1);

    return sum;
}

int main ( int argc, char *argv[] )
{
    int sum;
    
    /* initialize Lua */
    L = lua_open();

    /* load Lua base libraries */
    lua_baselibopen(L);

    /* load the script */
    lua_dofile(L, "add.lua");
    
    /* call the add function */
    sum = luaadd( 10, 15 );

    /* print the result */
    printf( "The sum is %d/n", sum );

    /* cleanup Lua */
    lua_close(L);

    return 0;
}

编译:
Linux平台,键入命令:
代码:
g++ luaadd.cpp -llua -llualib -o luaadd

运行程序:
代码:
./luaadd

如果正常的话程序应该显示:"The sum is 25"
如果你不是Linux操作系统,使用的是Vc++编译器,你需要:
1. 创建一个新的win32控制台应用工程。
2. 将文件luaadd.cpp添加到你的工程中。
3. 到Project, Settings点击Link页。
4. 添加lua+lib.lib到Object/library modules列表中。
5. 按F7编译程序。
运行程序以前,你需要确保lua+lib.dll文件放在windows可以找到的地方,将这个文件从C:/Program Files/Lua-5.0拷贝到Visual C++ project目录,如果编译没有错误的话,现在可以Ctrl+F5运行程序了。
关于全局变量:
如上面我们所看到的,lua_getglobal()将Lua的一个全局变量放至栈顶,假如我们的脚本包含一个全局变量z,下面这段代码将获取z的值:
代码:
lua_getglobal(L, "z");
    z = (int)lua_tonumber(L, 1);
    lua_pop(L, 1);


与之对应的lua_setglobal()用来设置Lua的一个全局变量的值,下面的这段代码将全局变量z的值设置为10
代码:
lua_pushnumber(L, 10);
    lua_setglobal(L, "z");

注意,不需要在你的Lua脚本中显式的全局变量,如果全局变量不存在,lua_setglobal()将创建一个新的全局变量。

手动使用C/C++编写Lua扩展插件

最近在研究如何在Windows 下嵌入Lua来完成业务模块编写的时候 发现Lua的一些问题,首先Lua作为一门脚本语言,其灵活性和可扩展性是很高的,要不然Cocos2d-x中也不会嵌入他来编写业务逻辑...
  • yue7603835
  • yue7603835
  • 2014年12月12日 02:04
  • 6089

如何使用Lua扩展C/C++应用系列3

作者:buxiu 转自:Lua中文网站(www.luachina.net)这次与第二篇文章相反,介绍如何在Lua中调用C/C++函数,首先,我们用C/C++创建一个函数并告诉Lua解释器,然后在Lua...
  • ouyangbuxiu
  • ouyangbuxiu
  • 2005年04月23日 10:35
  • 1845

如何使用Lua扩展C/C++应用系列1

作者:buxiu  转自:Lua中文网站(www.luachina.net)Lua是轻量级的脚本语言,可以很方便用来扩展C/C++应用程序,下面我们通过几个简单的例子来学习Lua如何扩展C/C++的。...
  • ouyangbuxiu
  • ouyangbuxiu
  • 2005年04月23日 10:32
  • 2470

用C语言扩展lua模块(入门)

lua中常常加载一些模块来实现某些功能。如果没有现成的模块以供require,那么我们只好自己写模块了。   前几天用C给lua扩展了sha1算法模块。提炼出来做个笔记。   lua示例代码如下:...
  • weiyuefei
  • weiyuefei
  • 2016年07月28日 11:43
  • 1124

Lua与C——扩展Lua(四)

因为Lua是可扩展的,我们可以通过编写新的C函数来扩展Lua。 先编写C函数;int add(lua_State *L) { int num1 = lua_tonumber(L, 1); ...
  • X805433354
  • X805433354
  • 2015年06月15日 18:08
  • 574

对lua的简单扩展,使它能快速关联C++的数据。

很早的时候,我纠结过一件事,假如,我在C++公开给脚本的接口中,要使用C++里的某一个对象,并且,我的程序中有很多个不同的lua虚拟机,每一个虚拟机要关联一个C++对象,并且这是多线程的,那么这时候应...
  • Gnorth
  • Gnorth
  • 2014年08月16日 12:46
  • 1063

C/C++ 与lua混合使用入门讲的比较好的文章

转载一篇将C/C++ 与lua混合使用入门讲的比较好的文章 转自 http://www.open-open.com/home/space-6246-do-blog-id-1426.html ...
  • linuxheik
  • linuxheik
  • 2016年11月18日 16:35
  • 1051

lua入门之二:c/c++ 调用lua及多个函数返回值的获取

当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 相同类型的栈来交互。C 函数从栈中获取她的参数,调用结束后将返回结果放到栈中。为了区分返回结果和栈中的其他的值,每个 C 函数还会返回结果的...
  • x356982611
  • x356982611
  • 2014年05月23日 13:56
  • 10348

C/C++代码里面读取Lua的Table

本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table。...
  • han1558249222
  • han1558249222
  • 2015年09月10日 00:10
  • 1888

lua中如何加入第三方拓展c库

背景及需求 lua作为一门发展成熟的脚本语言,正在变得越来越流行。它也可以作为和C/C++执行脚本交互的语言。并且Lua的整个库很小,当Lua自身带有的部分库无法满足我们自身需要实现的功能时,我们就需...
  • q270274978
  • q270274978
  • 2014年12月20日 13:10
  • 3722
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何使用Lua扩展C/C++应用系列2
举报原因:
原因补充:

(最多只允许输入30个字)