lua是一种轻量级的脚本语言,用来扩展c和c++非常好,在游戏开发中使用很普遍。
首先下载lua,因为我是在win7下,所以我这里下载了luaforwindows,安装到F:\Lua目录。当然你也可以去官网下载lua源码和二进制文件。
1. 打开vs(我这里是vs2012),创建一个空的win32控制台应用程序。
2. 右键项目属性,设置一些值。
VC++目录-库目录的值,添加:F:\Lua\lib
C/C++-附加包含目录,添加:F:\Lua\include
链接器-输入-附加依赖项,添加:lua51.lib
3. 创建luasum.cpp文件:
#include <iostream>

using namespace std;

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

static lua_State *L = NULL;

static int get_sum(lua_State *L) {

 int n = lua_gettop(L);
 double sum = 0;
 int i;

 for(i = 1; i <= n; ++ i) {
  if(!lua_isnumber(L, i)) {
   cout << "invalid argument i=" << i << endl;
  }else {
   sum += lua_tonumber(L, i);
  }
 }

 lua_pushnumber(L, n);
 lua_pushnumber(L, sum);

 return 2;
}

int main() {
 L = lua_open();
 luaL_openlibs(L);
 lua_register(L, "get_sum", get_sum);
 luaL_dofile(L, "sum.lua");
 lua_close(L);
 L = NULL;

 return 0;
}

首先包含所需的头文件,指定以C语言方式编译和链接,lua_State是一个复杂的结构体,在lua中非常重要,用来保存lua和c语言通信的所有信息,这样就可以避免使用全局变量了,也可以理解成状态机。除了lua_newstate外,几乎所有函数都以它作为第一个参数。这里暂时知道它是什么就好,以后再去细细研究它。这里定义了一个get_sum函数,就是在lua中调用的c函数,功能是:根据在lua中传入的参数,计算参数的个数和参数总和,然后返回给lua。
在lua中被调用的c函数类型(lua_CFunction):

typedef int (*lua_CFunction) (lua_State *L);

为了正确的和Lua通讯,C函数必须遵循下列协议:C函数通过 Lua 中的堆栈来接受参数,参数以正序入栈(第一个参数首先入栈)。因此,当函数开始的时候,lua_gettop(L)可以返回函数收到的参数个数。第一个参数(如果有的话)在索引 1 的地方,而最后一个参数在索引 lua_gettop(L) 处。当需要向 Lua 返回值的时候,C 函数只需要把它们以正序压到堆栈上(第一个返回值最先压入),然后返回这些返回值的个数。在这些返回值之下的,堆栈上的东西都会被 Lua 丢掉。 和 Lua 函数一样,从 Lua 中调用 C 函数也可以有很多返回值
lua_gettop函数:返回栈顶元素的索引,因为索引是从 1 开始编号的(从栈底开始就是1,如果从栈顶开始的话就是-1), 所以这个结果等于堆栈上的元素个数(因此返回 0 表示堆栈为空)。这里用来实现返回参数个数。
lua_isnumber函数:当给定索引的值是一个数字,或是一个可转换为数字的字符串时,返回 1 ,否则返回 0 。
lua_tonumber函数:把给定索引处的 Lua 值转换为lua_Number(typedef double lua_Number;)这样一个 C 类型,这个 Lua 值必须是一个数字或是一个可转换为数字的字符串; 否则lua_tonumber 返回 0 。
Alua_pushnumber函数:把一个数字 n 压栈。
lua_open函数:是创建一个新的独立的状态机(新版lua使用luaL_newstate代替lua_open)。
luaL_openlibs函数:打开所有标准lua库到指定的状态机。
lua_register函数:把 C 函数 f 设到全局变量 n 中,在lua文件中就可以使用get_sum函数了。它通过一个宏定义:

#define lua_register(L,n,f) \
            (lua_pushcfunction(L, f), lua_setglobal(L, n))

luaL_dofile函数:加载和运行指定lua文件,它通过一个宏定义:

(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))

lua_close函数:销毁指定 Lua 状态机中的所有对象(如果有垃圾收集相关的元方法的话,会调用它们),并且释放状态机中使用的所有动态内存。在一些平台上,你可以不必调用这个函数,因为当宿主程序结束的时候,所有的资源就自然被释放掉了。另一方面,长期运行的程序,比如一个后台程序或是一个 web 服务器,当不再需要它们的时候就应该释放掉相关状态机,这样可以避免状态机扩张的过大。
想了解更多函数可以参考:http://www.codingnow.com/2000/download/lua_manual.html

下面是sum.lua代码:

n, sum = get_sum(10, 20, 30);
print("num: ", n);
print("sum: ", sum);

ctrl+f5,就可以看到命令符窗口打印的信息了。
感觉还是比较简单的,这样你就可以把很多逻辑工作用lua去实现,然后在c中去执行lua文件。

lua面向对象模拟简介

lua不是面向对象语言,但可以通过表(table)和元表(metatable)来模拟。table 是 lua 中唯一的一种数据结构,它可以用来描述原始的数组、符号表、集合、 记录、...

阅读全文

在c/c++中调用lua函数

上篇文章完成了在lua中调用c/c++函数,现在来实现在c/c++中调用lua函数。 首先完成lua代码,创建sum.lua: function add(x, y) return x + y; end 为了...

阅读全文

c++ 拷贝构造函数

1. 什么是拷贝构造函数 用c++ 创建一个空类的时候,编译器会默认为这个类创建:默认构造函数、析构函数、拷贝构造函数、赋值构造函数。 如: class A{ publi...

阅读全文

欢迎留言