lua和C++的交互(1)

/*
以前听的一个故事,当年Java的创造者讲课的时候,一开始先拿一个简单的不能简单的小例子,
不断的扩展,最后成为一个复杂而完美的程序。
一个重要之重要的概念,就是栈。Lua与别的语言交互以及交换数据,是通过栈完成的。
*/
#include <iostream>
using namespace std;

extern "C"   //这部分按C语言进行编译而不是C++
{
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

class CLuaFn
{
public:
    CLuaFn(void);
    ~CLuaFn(void);

    void Init();    //初始化Lua对象指针参数
    void Close();   //关闭Lua对象指针

    bool LoadLuaFile(const char* pFileName);                                 //加载指定的Lua文件
    bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);    //执行指定Lua文件中的函数

private:
    lua_State* m_pState;  //这个是Lua的State对象指针,一个lua文件对应一个
};

void CLuaFn::Init()
{
    if(NULL == m_pState)
    {
        m_pState = lua_open();   //返回一个lua对象指针
        luaL_openlibs(m_pState); //加载所有可能用到的Lua基本库,比如加载lua的string库,io库,math库等等等等
    }
}

void CLuaFn:Close()
{
    if(NULL != m_pState)
    {
        lua_close(m_pState);   //关闭lua对象并释放指针
        m_pState = NULL;
    }
}

/*
加载指定的Lua文件
这里要特别说明一下,因为Lua是脚本语言,加载lua文件本身的时候才会编译
所以在加载文件的时候尽量放在程序的初始化中,因为当你执行luaL_dofile()函数的时候,
Lua会启用语法分析器,去分析你的脚本语法是否符合Lua规则,如果你胡乱的传一个文件过去,
Lua就会告诉你文件语法错误,无法加载。如果你的Lua脚本很大,函数很多,语法分析器会比较耗时,
所以,加载的时候,尽量放在合适的地方,而且,对于一个Lua文件而言,
反复加载luaL_dofile()除了会使你的CPU变热没有任何意义
*/
bool CLuaFn:LoadLuaFile(const char* pFileName)
{
    int nRet = 0;
    if(m_pState == NULL)
    {
        return false;
    }
    nRet = luaL_dofile(m_pState, pFileName);
    if(nRet != 0)
    {
        //lua_tostring(m_pState,-1)-1取m_pState栈顶数据,即错误提示字符串 (-1相对栈顶位置,1相对栈底的绝对位置)
        printf("CLuaFn::LoadLuaFile(%s) is file(%d)(%s)\n", pFileName, nRet, lua_tostring(m_pState,-1));
        return false;
    }

    return true;
}

//执行指定Lua文件中的函数
bool CLuaFn:CallFileFn(const char*pFunctionName, int nParam1, int nParam2)
{
    int nRet = 0;
    if(m_pState == NULL)
    {
        return false;
    }
    lua_getglobal(m_pState, pFunctionName); //验证Lua函数是否在当前加载的Lua文件中,并把指针指向这个函数位置
    lua_pushnumber(m_pState, nParam1);      //压栈操作,把数据压入数据栈
    lua_pushnumber(m_pState, nParam2);
}
时间: 2024-08-04 05:19:27

lua和C++的交互(1)的相关文章

Lua与C/C++交互问题

初学lua,遇到注册C/C++交互函数问题 在lua与C/C++交互时,C/C++的注册Lua函数若是一个有返回类型(压栈)而不是获取类型的时候应该返回1而不是返回0,否则会出现在Lua中值为nil(空) 不太明白为什么事这样,如果有知道的大神,麻烦讲解下 如: 应该是 int createClass(lua_State *L) { lua_class *newLua = (lua_class*)lua_newuserdata(L , sizeof(lua_class)); new (newLu

Lua脚本和C++交互(一)

现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或帮你查看别的玩家或者NPC的状态...如此等等. 但是我觉得,其实脚本语言与C++的结合,远远比你在游戏中看到的特效要来的迅猛.它可以运用到方方面面的领域,比如你最常见的应用领域.比如,你可以用文本编辑器,写一个脚本语言,然后用你的程序加载一下,就会产生出很绚丽的界面.亦或一两句文本语言,就会让你的

lua与C++的交互

参考文档地址: Lua 与C交互 项目名字:SimFrame 项目语言:C++,lua(5.1) 项目框架:Cocos2d-x 2.2.3 一.创建项目 首先 cd到cocos2d-x包下的tools中的project-creator目录,输入 ./create_project.py -project SimFrame -package com.zyl.test -language lua 在projects目录下会有一个SimFrame的项目,打开SimFrame.xcodeproj(我用的是

Lua与C的交互

Lua 与 C 的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1.  读写Lua全局变量的函数: 2.  调用Lua函数的函数: 3.  运行Lua代码片段的函数: 4.  注册C函数后可以在Lua中被调用的函数: 在C和LUA之间交互的关键在于一个虚拟栈(virtual stack),数据交互通过栈进行.操作数据时,首先将数据拷贝到栈上,然后获取数据,栈中的每个数据

Lua 跟 C++ 的交互

Lua 和 C++ 是这样交互的 乱七八糟的前戏: 1. 到官网下载 Lua 文件  可參考 ->  Lua 下载与配置 2. 设置环境  可參考  ->  VS 配置Lua环境 交互过程有: 1. C++ 訪问 Lua 的变量 2. C++ 调用 Lua 的函数 3. Lua 訪问 C++ 的变量 4. Lua 訪问 C++ 的函数 No code say a j8 C++ 调用 Lua #include <iostream> #include <string> //

转载:lua和c的交互

1 extern "C" { 2 #include "lua.h" 3 #include "lualib.h" 4 #include "lauxlib.h" 5 } 6 7 #include <iostream> 8 #include <string> 9 using namespace std; 10 11 int main() 12 { 13 //Lua示例代码 14 char *szLua_cod

Lua 与C/C++ 交互系列:Light userdata翻译

利用零碎的时间,先把以后用的知识点提前准备好.最近比较忙,正在准备一篇绑定C++对象到Lua中.但是,不想轻易下手,希望做足准备. 这篇翻译来自于lua-users.org   ,原文地址. Light User Data Light userdata, like heavy userdata, are a form of userdata, which is one of the basic data types in Lua .Light userdata are characterized

Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-2)

1.本文继续讲解Lua调用C/C++函数,本文的重点是通过metatable来实现Lua Code面向对象调用注册的C函数.本文中涉及的Environment 伪索引,userdata 以及GC 垃圾回收器的内容,都是简单的讲解.不作为本文的重点,这些内容都将在以后的章节中继续讲解. 2.本文涉及的到主要知识点补充说明. 2.1 void *lua_newuserdata (lua_State *L, size_t size); 函数说明 This function allocates a ne

Lua 与C/C++ 交互系列: Lua调用C/C++函数(3)

1.Lua API中提供注册C函数关键在lua_pushcclouse()函数.该函数可以在Lua Code中定义C函数. 但是Lua 提供了几个常用的宏定义,用于注册C函数. 这几个宏定义为: /#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) #define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) LUALIB_API vo