C++与Lua本质原始交互API

[ __

Lua中ipairs和pairs的区别与使用

](/2015/11/11/lua_pairs_ipairs/ “Lua中ipairs和pairs的区别与使用”)

[

C++可变参数

__](/2015/12/09/cpp_vargs/ “C++可变参数”)

我们用一个例子来说明.

. . .

首先, 我们需要创建一个 C++ 的主程序,以便同 Lua 进行通信. 如下 :

lua_test.cpp

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
extern "C" {   
      
    #include "lualib.h"  
    #include "lauxlib.h"  
};    
  
#include <iostream>  
#include <lua.hpp>  
  
extern "C" {  
    static int (lua_State *L) {  
        double arg = luaL_checknumber(L,1);  
        lua_pushnumber(L, arg * 0.5);  
        return 1;  
    }  
}  
  
using namespace std;  
  
int main(int argc, const char * argv[])  
{  
    lua_State *L;  
    L = luaL_newstate();  
      
    cout << ">> 载入(可选)标准库,以便使用打印功能" << endl;  
    luaL_openlibs(L);  
  
    cout << ">> 载入文件,暂不执行" << endl;  
    if (luaL_loadfile(L, "luascript.lua")) {  
        cerr << "载入文件出现错误" << endl;  
        cerr << lua_tostring(L, -1) << endl;  
        lua_pop(L,1);  
    }  
  
    cout << ">> 从 C++ 写入数据 cppvar" << endl;  
    lua_pushnumber(L, 1.1);  
    lua_setglobal(L, "cppvar");  
  
    cout << ">> 执行 lua 文件" << endl << endl;  
    if (lua_pcall(L,0, LUA_MULTRET, 0)) {  
        cerr << "执行过程中出现错误" << endl;  
        cerr << lua_tostring(L, -1) << endl;  
        lua_pop(L,1);  
    }  
  
    cout << ">> 从 Lua 读取全局变量 luavar 到 C++" << endl;  
    lua_getglobal(L, "luavar");  
    double luavar = lua_tonumber(L,-1);  
    lua_pop(L,1);  
    cout << "C++ 从 Lua 读取到的 luavar = " << luavar << endl << endl;  
  
    cout << ">> 从 C++ 执行 Lua 的方法 myfunction" << endl;  
    lua_getglobal(L, "myluafunction");  
    lua_pushnumber(L, 5);  
    lua_pcall(L, 1, 1, 0);  
    cout << "函数返回值是:" << lua_tostring(L, -1) << endl << endl;  
    lua_pop(L,1);  
  
    cout << ">> 从 Lua 执行 C++ 的方法" << endl;  
    cout << ">>>> 首先在 Lua 中注册 C++ 方法" << endl;  
    lua_pushcfunction(L,l_cppfunction);  
    lua_setglobal(L, "cppfunction");  
  
    cout << ">>>> 调用 Lua 函数以执行 C++ 函数" << endl;  
    lua_getglobal(L, "myfunction");  
    lua_pushnumber(L, 5);  
    lua_pcall(L, 1, 1, 0);  
    cout << "函数返回值是:" << lua_tonumber(L, -1) << endl << endl;  
    lua_pop(L,1);  
  
    cout << ">> 释放 Lua 资源" << endl;  
    lua_close(L);  
  
    return 0;  
}  

—|—

编译命令 : g++ lua_test.cpp -o ltest -llua -ldl

创建Lua文件

其次,是 lua 文件,我们将它命名为 luascript.lua

luascript.lua

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
print("Hello from Lua")  
print("Lua code is capable of reading the value set from C++", cppvar)  
luavar = cppvar * 3  
  
function myluafunction(times)  
  return string.rep("(-)", times)  
end  
  
function myfunction(arg)  
  return cppfunction(arg)  
end  

—|—

打印结果

运行 cpp 文件,结果如下:

>> 载入(可选)标准库,以便使用打印功能
>> 载入文件,暂不执行
>> 从 C++ 写入数据 cppvar
>> 执行 lua 文件

Hello from Lua
Lua code is capable of reading the value set from C++   1.1
>> 从 Lua 读取全局变量 luavar 到 C++
C++ 从 Lua 读取到的 luavar = 3.3

>> 从 C++ 执行 Lua 的方法 myfunction
函数返回值是:(-)(-)(-)(-)(-)

>> 从 Lua 执行 C++ 的方法
>>>> 首先在 Lua 中注册 C++ 方法
>>>> 调用 Lua 函数以执行 C++ 函数
函数返回值是:2.5

>> 释放 Lua 资源

参考

参考

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017