找了几天的资料,关于lua调用C++类,无非就是千篇一律的东西,没实际性内容,并且本菜又不喜欢luaplus,luabind,luaTinks等之类的二次封装(一会儿C,一会儿C++,说不定编译狂出错)
我是用来解释脚本的,不是用来搞游戏的。这么高深的东西,咱变通下。
在C函数里调用类函数,在注册就可以。直接看代码
// luatest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
};
#include "Cceshi.h" //我们的测试类,里面就一个print函数。
#include "stdio.h"
#include <iostream>
using namespace std;
static int gxm(lua_State *L) //每个注册的C函数都应该遵守这样的调用
{
int n = lua_gettop(L);
double sum;
int i;
for (i=1;i<=n;i++)
{
sum+=lua_tonumber(L,i);
}
if (sum>100)
{
cout<<"累加超过100"<<endl;
}
lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
Cceshi gxm2;
gxm2.gxm1();
return 2;
}
int _tmain(int argc, _TCHAR* argv[])
{
//初始化Lua
lua_State* L = luaL_newstate();
//调用基本库
luaL_openlibs(L);
lua_register(L,"累加",gxm);
luaL_dofile(L,"C:\\ceshi.lua");
//关闭对象
lua_close(L);
return 0;
}
很简单吧。我们的ceshi.lua写这样的。
avg,sum=累加(10,20,30,40,50)
print("The avg is ",sum)
print("The sum is ",avg)
界面如下:
第一个输出是我们的cout
第二个中文是我们调用的一个最简单的类
下面2个是lua脚本里的prinf
这样,我们就测试出了类函数,执行顺序等。有个模糊的概念在脑子里了。
我们还可以看到一个问题。上面注册的函数名是中文的。我只能再次痛恨这帮网上的垃圾,你们抄归抄,也不知道抄的好点啊,诱导咱这种良知少年,网上找了一大圈的支持中文方法。竟然lib编译不通过。。无语,自己又菜,抄代码的时候,竟然把别人复制的html代码复制进去了。。。。我郁闷死
修改方法如下:
找到llex.c文件
找到如下函数
void luaX_next (LexState *ls) {
在这个上面有个default:
在这个下面,我们把其中一段修改成:
if (lislalpha(ls->current)||ls->current == '_'|| ls->current > 0x80) { /* identifier or reserved word? */
TString *ts;
do {
if(ls->current > 0x80)
{
save_and_next(ls);
save_and_next(ls);
}
else
save_and_next(ls);
} while (lislalnum(ls->current)||ls->current == '_'||ls->current > 0x80);
对应修改,很简单的。编译的静态库就可支持中文了。