通过例子学习Lua(6)—C/C++中用Lua函数

开发 前端
偶们这次主要说说怎么由Lua定义函数, 然后在C或者C++中调用. 这里偶们暂不涉及C++的对象问题, 只讨论调用函数的参数, 返回值和全局变量的使用。

1.简介

偶们这次主要说说怎么由Lua定义函数, 然后在C或者C++中调用. 这里偶们暂不涉及C++的对象问题, 只讨论调用函数的参数, 返回值和全局变量的使用.

2.

这里偶们在e12.lua里先定义一个简单的add(), x,y为加法的两个参数,return 直接返回相加后的结果.

例e12.lua

  1. -- add two numbers   
  2. function add ( x, y )   
  3. return x + y   end 

在前一次里, 偶们说到 lua_dofile() 可以直接在C中执行lua文件. 因为偶们这个程序里只定义了一个add()函数, 所以程序执行后并不直接结果, 效果相当于在C中定义了一个函数一样.

  Lua的函数可以有多个参数, 也可以有多个返回值, 这都是由栈(stack)实现的.需要调用一个函数时, 就把这个函数压入栈, 然后顺序压入所有参数, 然后用lua_call()调用这个函数. 函数返回后, 返回值也是存放在栈中. 这个过程和汇编执行函数调用的过程是一样的.

  例e13.cpp 是一个调用上面的Lua函数的例子

  1. #include 
  2.   extern "C" { // 这是个C++程序, 所以要extern "C", 
  3.   // 因为lua的头文件都是C格式的 
  4.  
  5.   #include "lua.h" 
  6.   #include "lualib.h" 
  7.   #include "lauxlib.h" 
  8.   } 
  9.   /* the Lua interpreter */ 
  10.   lua_State* L; 
  11.   int luaadd ( int x, int y ) 
  12.   { 
  13.   int sum; 
  14.   /* the function name */ 
  15.   lua_getglobal(L, "add"); 
  16.   /* the first argument */ 
  17.   lua_pushnumber(L, x); 
  18.   /* the second argument */ 
  19.   lua_pushnumber(L, y); 
  20.   /* call the function with 2 
  21.   arguments, return 1 result */ 
  22.   lua_call(L, 2, 1); 
  23.   /* get the result */ 
  24.   sum = (int)lua_tonumber(L, -1); 
  25.   lua_pop(L, 1); 
  26.   return sum; 
  27.   } 
  28.   int main ( int argc, char *argv[] ) 
  29.   { 
  30.   int sum; 
  31.   /* initialize Lua */ 
  32.   L = lua_open(); 
  33.   /* load Lua base libraries */ 
  34.   lua_baselibopen(L); 
  35.   /* load the script */ 
  36.   lua_dofile(L, "e12.lua"); 
  37.   /* call the add function */ 
  38.   sum = luaadd( 10, 15 ); 
  39.   /* print the result */ 
  40.   printf( "The sum is %d\n", sum ); 
  41.   /* cleanup Lua */ 
  42.   lua_close(L); 
  43.   return 0; 
  44.   } 

程序说明:

main中过程偶们上次已经说过了, 所以这次只说说luaadd的过程

* 首先用lua_getglobal()把add函数压栈

* 然后用lua_pushnumber()依次把x,y压栈

* 然后调用lua_call(), 并且告诉程序偶们有两个参数一个返回值

* 接着偶们从栈顶取回返回值, 用lua_tonumber()

* ***偶们用lua_pop()把返回值清掉

运行结果:

The sum is 25

编译方法

Linux下把程序存成e13.cpp

g++ e13.cpp -llua -llualib -o e13

./e13

VC下编译方法

* 首先建立一个空的Win32 Console Application Project

* 把e13.cpp加入工程中

* 点project setting,然后设置link选项, 再加上lua.lib lualib.lib两个额外的库

* ***编译

建立好的project可以在这里下载

VC http://tonyandpaige.com/tutorials/luaadd.zip

Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz

3.全局变量

上面偶们用到了lua_getglobal()但并没有详细讲, 这里偶们再举两个小例子来说下全局变量

lua_getglobal()的作用就是把lua中全局变量的值压入栈

lua_getglobal(L, "z");

z = (int)lua_tonumber(L, 1);

lua_pop(L, 1);

假设Lua程序中定义了一个全局变量z, 这段小程序就是把z的值取出放入C的变量z中.

另外Lua中还有一个对应的函数lua_setglobal(), 作用是用栈顶的值填充指定的全局变量

lua_pushnumber(L, 10);

lua_setglobal(L, "z");

例如这段小程序就是把lua中的全局变量z设为10, 如果lua中未定义z的话, 就会自动创建一个

全局变量z并设为10.

4.试试看

自己写个函数用C/C++来调用下试

原文链接:http://tech.it168.com/j/2008-02-14/200802141408319.shtml

责任编辑:陈四芳 来源: 来自ITPUB论坛
相关推荐

2013-12-13 16:46:18

Lua脚本语言

2011-08-23 16:59:16

C++LUA脚本LUA API

2013-12-13 15:54:32

Lua脚本语言

2011-08-22 17:25:31

LuaC++函数

2013-12-13 15:42:32

Lua脚本语言

2013-12-13 15:48:52

Lua脚本语言

2013-12-12 17:30:03

Lua例子

2011-08-22 17:13:00

LuaC++函数

2011-08-25 16:47:53

LuaC++ 证书

2011-09-06 17:12:25

Lua脚本C++封装库

2014-09-19 10:46:36

LuaCC++

2011-08-24 10:32:03

LuaPlusC++Lua

2010-01-14 17:42:47

CC++

2010-02-05 15:59:26

C++函数重载

2011-08-29 16:48:50

Lua配置文件C++

2011-08-24 13:27:07

Lua 游戏C接口脚本

2021-01-12 06:42:50

Lua脚本语言编程语言

2013-12-13 17:33:22

Lua对象管理

2011-08-25 15:35:18

Lua游戏对象

2011-08-23 11:13:56

Lua
点赞
收藏

51CTO技术栈公众号