Lua学习笔记6:C++和Lua的相互调用

Lua版本:5.2.3

一 C++ 调用Lua

1 目录结构

CppCallLua

{

main.cpp

script{

test.lua

}

lualia{

lua.h

lualib.h

laux.lib.h

luaconf.h

liblua.a

}

}

2 代码

//main.cpp

#include <iostream>

extern "C"

{

#include "lualib/lua.h"

#include "lualib/lualib.h"

#include "lualib/lauxlib.h"

}

using namespace std;

int main()

{

lua_State* L = luaL_newstate() ;

luaopen_base(L) ;// 不知道为什么这里使用luaL_openlibs(L)会报错

luaL_dofile(L, "script/test.lua") ;

lua_getglobal(L, "add") ;

lua_pushnumber(L, 1) ;

lua_pushnumber(L, 2) ;

lua_pcall(L, 2, 1, 0) ;

int sum = (int)lua_tonumber(L, -1) ;

lua_pop(L, -1) ;

lua_close(L) ;

cout << "1 + 2 = " << sum << endl;

return 0 ;

}

//test.lua

function add(x, y)

return x + y

end

二 lua调用C++

lua调用C++函数还是以C++为主体,在C++中使用运行Lua脚本,在Lua脚本中又调用C++自己实现的函数。

实际上就C++通过Lua脚本调用自己的函数。

1 目录结构

LuaCallCpp

{

main.cpp

test.lua

lualia{

lua.h

lualib.h

laux.lib.h

luaconf.h

liblua.a

}

}

2 代码

// main.cpp

#include <iostream>

extern "C"

{

#include "lualib/lua.h"

#include "lualib/lualib.h"

#include "lualib/lauxlib.h"

}

using namespace std;

lua_State* L ;

static int average(lua_State *L)

{

// num of args

int n =  lua_gettop(L) ;

double sum = 0 ;

int i = 0 ;

for ( i = 1; i <= n; ++i)

{

sum += lua_tonumber(L, i) ;

}

// push the average

lua_pushnumber(L, sum / n) ;

// push the sum

lua_pushnumber(L, sum) ;

return 2;

}

int main()

{

L = luaL_newstate() ;

luaopen_base(L) ;

// register function

lua_register(L, "average", average) ;

luaL_dofile(L, "test.lua") ;

lua_close(L) ;

return 0 ;

}

// test.lua

avg, sum = average(1, 2, 3, 4, 5)

print ("The average is ", avg)

print ("The sum is ", sum)

时间: 2024-11-05 13:36:39

Lua学习笔记6:C++和Lua的相互调用的相关文章

Lua学习笔记--环境配置&amp;Hello World

最近发现要恶补的东西实在是太多了,DX还没学完,现在发现还要用Lua脚本语言,于是,我的笔记又加了一个系列,Lua学习笔记. 一.简介 Lua是一门小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行.Lua并没有提供强大的库,这是由它的定位决定的.所以Lua不适合作为开发独立应用程序的语言. Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

Lua学习笔记9:多文件

一 终端中执行多个文件:-l 加入在文件一中定义了一个变量,在另一文件中输出这个变量,代码如下: --file1.lua num = 100 --file2.lua print(num) 终端输入(注意:不是lua命令行): lua -lfile1 -lfile2 注意:不要加上文件后缀名.lua 二 命令行中加载文件 --lib.lua function norm(x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twic

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com

Lua学习笔记(二):基本语法

Lua学习指南:http://www.lua.org/manual/ 首先我们要明确的一点是:在Lua中,除了关键字外一切都是变量. Lua关键字 可以查看这个地址:http://www.lua.org/manual/5.1/manual.html#2.1 关于分号 语句的最后可以用分号";"表示结束,也可以不写. 而对于一行有多个语句的情况下,语句之间可以用分号";"隔开,也可以用空白隔开.一般来说,建议总是用分号隔开. 使用注释 单行注释使用“--”即可,以后的

Lua学习笔记(三):表的构造

构造器是创建和初始化表的表达式.表是Lua特有的功能强大的东西.最简单的构造函数是{},用来创建一个空表.可以直接初始化数组: 1 days = {"Sunday", "Monday", "Tuesday", "Wednesday", 2 "Thursday", "Friday", "Saturday"} Lua将“Sunday”初始化days[1](第一个元素索引为

lua学习笔记之基本语法

Lua学习笔记之基本语法 1.  赋值语句 赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello".."world" t.n = t.n+1 lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会一次赋给左边的变量. a,b = 10,2*x    <-->a = 10;b = 2*x 遇到赋值语句lua会先计算右边所有的值然后再执行赋值操纵,所以我们可以这样进行交换变量的值: x,y = y,x    

lua学习笔记之函数

Lua学习笔记之函数 1.  函数的作用 函数主要完成指定的任务,这样的情况下函数作为调用语句使用,函数可以计算并返回值,这样的情况下函数作为赋值语句的表达式使用. 语法: funcationfunc_name(arguments-list) Statements-list end 调用函数的时候,如果参数列表为空,必须使用()表示是函数调用. Print(8*9,9/8) a = math.sin(3) +math.cos(10) print(os.date()) 上述规则有一个例外,当函数只

Lua学习笔记(2) —— 风格

前一篇大概学习了lua常用的语法,都是些刚入门时应该了解的.见这里 Lua学习笔记(1) ——语法 这篇主要记录一些关于lua代码风格的经验,如果不了解它们,还是拿着函数式或传统面向对象的风格去写lua,就永远无法了解lua的精华之所在,弃之所长,取其所短. 1. 函数类型的变量 2. 匿名函数 3. 闭包 4. 表 5. 协程 6. 虚拟机