C语言和Lua天生有两大隔阂:

一、C语言是静态数据类型,Lua是动态数据类型

二、C语言需要程序员管理内存,Lua自动管理内存

为了跨越世俗走到一起,肯定需要解决方案。

解决第一点看上去比较容易,C语言中有union。

可是第二点呢?万一C语言正引用着Lua的一个值,Lua自动释放了怎么办?

所以就有了一种比union更好的解决方案:栈。

这是一个虚拟的栈,是沟通两者的桥梁,两者的数据交换全都通过这个栈进行,这样只要不pop,Lua就不会自动释放,而什么时候pop由C语言说了算。

下面是一段喜闻乐见的示例。

由于新建的cpp文件,所以需要extern "C" 。

 #include <stdio.h>
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
} //调用lua中的add函数
int call_lua_add(lua_State *L)
{
lua_getglobal(L, "add"); //获取add函数
lua_pushnumber(L, ); //第一个操作数入栈
lua_pushnumber(L, ); //第二个操作数入栈
lua_pcall(L, , , ); //调用函数,2个参数,1个返回值
int sum = (int)lua_tonumber(L, -); //获取栈顶元素(结果)
lua_pop(L, ); //栈顶元素出栈
return sum;
} int main()
{
lua_State *L = luaL_newstate(); //新建lua解释器
luaL_openlibs(L); //载入lua所有函数库
luaL_dofile(L, "Test.lua"); //执行"Test.lua"文件中的代码
printf("%d\n", call_lua_add(L));
lua_close(L); //释放
return ;
}

下面是Test.lua文件中的内容:

 function add(x, y)
return x + y;
end

C语言中调用Lua的更多相关文章

  1. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  2. vs如何在C++中调用Lua

    最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscri ...

  3. vs2013如何在C++中调用Lua(二)

    Lua学习笔记 vs2013如何在C++中调用Lua (此为转载教程) 本人试过完全可行 一.准备工作 1.下载Lua源码,地址:http://www.lua.org/download.html(我用 ...

  4. 如何在C语言中调用Swift函数

    在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中 ...

  5. C中调用Lua函数

    我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglob ...

  6. 【转载】如何在C语言中调用shell命令

    转载自:http://blog.csdn.net/chdhust/article/details/7951576 如何在C语言中调用shell命令 在linux操作系统中,很多shell命令使用起来非 ...

  7. C语言中调用运行python程序

    C语言中调用运行python程序: Python代码如下: 创建test.py. #!/usr/bin/python3 #test.py import sys x = ]) print x*x 注意: ...

  8. C中调用LUA回调(LUA注册表)

    实现原理: 通过将LUA中得回调函数存入LUA注册表中来保存LUA函数,然后在需要回调时从LUA注册表中取出LUA函数进行调用 下面是一些预备知识:(学习两个重要的函数) 原汁原味的英文解释的最透彻, ...

  9. 『Python CoolBook』C扩展库_其六_从C语言中调用Python代码

    点击进入项目 一.C语言运行pyfun的PyObject对象 思路是在C语言中提供实参,传给python函数: 获取py函数对象(PyObject),函数参数(C类型) 获取GIL(PyGILStat ...

随机推荐

  1. 实现app上对csdn的文章查看,以及文章中图片的保存 (制作csdn app 完结篇)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24022165 今天给大家带来CSDN的完结篇,即增加文章的查看和文章中图片的保存 ...

  2. oracle 查看表属主和表空间sql

    查看表空间 select * from user_tablespaces where table_name = 'TableName' 查看表属主 select  Owner  from all_ta ...

  3. EL表达式读取数据(在Map,javaBean,List)

    <%@page import="cn.hncu.domain.User"%><!--这里是进行导包--><%@ page language=" ...

  4. 获取java项目 classpath目录

    this.getClass().getResource("/").getPath(); 从根目录获取载入文件: this.getClass().getResourceAsStrea ...

  5. Socket.io 0.7 – Sending messages to individual clients

    Note that this is just for Socket.io version 0.7, and possibly higher if they don’t change the API a ...

  6. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  7. xml_02

    1.xml 2.对于XML文档的约束   |-DTD      <!DOCTYPE 根元素 [       <!ELEMENT 元素名 (xx)>       <!ATTLIS ...

  8. android.util.AndroidRuntimeException: requestFeature() must be called before adding content解决办法

    最近在学习第一行代码这本书,里面的关于activity生命周期有一段例子,但是我自己用mac上装的as运行一直出问题,看log的话就是android.util.AndroidRuntimeExcept ...

  9. SQL Server调优系列基础篇 - 常用运算符总结

    前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...

  10. 学习笔记_JDBC_1_Demo1_连接数据库的基本操作和步骤

    常见错误:连数据库时,这句话String url = "jdbc:mysql://localhost/数据库名";数据库名可能和你建的数据库名不一样 1.安装Mysql,记住此时你 ...