自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

通過例子學(xué)習(xí)Lua(6)—C/C++中用Lua函數(shù)

開發(fā) 前端
偶們這次主要說說怎么由Lua定義函數(shù), 然后在C或者C++中調(diào)用. 這里偶們暫不涉及C++的對象問題, 只討論調(diào)用函數(shù)的參數(shù), 返回值和全局變量的使用。

1.簡介

偶們這次主要說說怎么由Lua定義函數(shù), 然后在C或者C++中調(diào)用. 這里偶們暫不涉及C++的對象問題, 只討論調(diào)用函數(shù)的參數(shù), 返回值和全局變量的使用.

2.

這里偶們在e12.lua里先定義一個簡單的add(), x,y為加法的兩個參數(shù),return 直接返回相加后的結(jié)果.

例e12.lua

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

在前一次里, 偶們說到 lua_dofile() 可以直接在C中執(zhí)行l(wèi)ua文件. 因為偶們這個程序里只定義了一個add()函數(shù), 所以程序執(zhí)行后并不直接結(jié)果, 效果相當(dāng)于在C中定義了一個函數(shù)一樣.

  Lua的函數(shù)可以有多個參數(shù), 也可以有多個返回值, 這都是由棧(stack)實現(xiàn)的.需要調(diào)用一個函數(shù)時, 就把這個函數(shù)壓入棧, 然后順序壓入所有參數(shù), 然后用lua_call()調(diào)用這個函數(shù). 函數(shù)返回后, 返回值也是存放在棧中. 這個過程和匯編執(zhí)行函數(shù)調(diào)用的過程是一樣的.

  例e13.cpp 是一個調(diào)用上面的Lua函數(shù)的例子

  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中過程偶們上次已經(jīng)說過了, 所以這次只說說luaadd的過程

* 首先用lua_getglobal()把a(bǔ)dd函數(shù)壓棧

* 然后用lua_pushnumber()依次把x,y壓棧

* 然后調(diào)用lua_call(), 并且告訴程序偶們有兩個參數(shù)一個返回值

* 接著偶們從棧頂取回返回值, 用lua_tonumber()

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

運行結(jié)果:

The sum is 25

編譯方法

Linux下把程序存成e13.cpp

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

./e13

VC下編譯方法

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

* 把e13.cpp加入工程中

* 點project setting,然后設(shè)置link選項, 再加上lua.lib lualib.lib兩個額外的庫

* ***編譯

建立好的project可以在這里下載

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

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

3.全局變量

上面偶們用到了lua_getglobal()但并沒有詳細(xì)講, 這里偶們再舉兩個小例子來說下全局變量

lua_getglobal()的作用就是把lua中全局變量的值壓入棧

lua_getglobal(L, "z");

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

lua_pop(L, 1);

假設(shè)Lua程序中定義了一個全局變量z, 這段小程序就是把z的值取出放入C的變量z中.

另外Lua中還有一個對應(yīng)的函數(shù)lua_setglobal(), 作用是用棧頂?shù)闹堤畛渲付ǖ娜肿兞?/p>

lua_pushnumber(L, 10);

lua_setglobal(L, "z");

例如這段小程序就是把lua中的全局變量z設(shè)為10, 如果lua中未定義z的話, 就會自動創(chuàng)建一個

全局變量z并設(shè)為10.

4.試試看

自己寫個函數(shù)用C/C++來調(diào)用下試

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

責(zé)任編輯:陳四芳 來源: 來自ITPUB論壇
相關(guān)推薦

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++函數(shù)

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++函數(shù)

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++函數(shù)重載

2011-08-29 16:48:50

Lua配置文件C++

2011-08-24 13:27:07

Lua 游戲C接口腳本

2013-12-13 17:33:22

Lua對象管理

2011-08-25 15:35:18

Lua游戲對象

2011-08-23 11:13:56

Lua

2021-01-12 06:42:50

Lua腳本語言編程語言
點贊
收藏

51CTO技術(shù)棧公眾號