Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Lua入门之四:Lua调用C/C++库(函数压栈方式)

前面讲过Lua载入dll的方式去调用函数库,下面介绍的是函数压栈的方式调用函数库,通过lua_register把函数注册到lua的栈中,lua_register的定义如下,#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))看了定义就知道,其实就是函数压栈,然后设置为全局变量,这样lua就可以调用它了。// libforlua-2.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <math.h>//lua头文件
#ifdef __cplusplus
extern "C" {
#include "lua.h" 
#include <lauxlib.h> 
#include <lualib.h> 
} #else#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>#endif
#pragma comment(lib, "lua51.lib")
static int math_abs(lua_State *L)
{
 //获取传入的参数
 lua_pushnumber(L, abs((int)luaL_checknumber(L, 1))); return 1;
}static int math_cos(lua_State *L)
{ lua_pushnumber(L, cos((double)luaL_checknumber(L, 1))); return 1;}static int math_sin(lua_State *L)
{ lua_pushnumber(L, sin((double)luaL_checknumber(L, 1)));
 return 1;
}static const luaL_reg mathlib[] = {
 { "abs", math_abs },
 { "cos", math_cos },
 { "sin", math_sin },
 { NULL, NULL }
};
static int ShowMessage(lua_State * L)
{
 lua_pushnumber(L, 1000);
 printf("show message and push 1000 ");
 return -1;
} int main(int argc, char** argv)
{
 lua_State* L = lua_open(); luaL_openlibs(L); // lua_register(L, "cos", math_cos);
 // lua_register(L, "sin", math_sin);
 // lua_register(L, "abs", math_abs);
 //#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
 luaL_register(L, "DY_MATH", mathlib);
 char *luapath="./script/lua/lua.lua";
 luaL_dofile(L, luapath); double sinv = 30*3.1415926/180.0;
 lua_getglobal(L, "SIN");
 lua_pushnumber(L, sinv);
 if (0 != lua_pcall(L, 1, 1, 0))
 {
  printf("cpp call lua function failed ");
 }
 printf("sin(%f)=%f ", sinv, lua_tonumber(L, -1));
 lua_pop(L, 1);
 lua_getglobal(L, "COS");
 lua_pushnumber(L, 0.5);
 if (0 != lua_pcall(L, 1, 1, 0))
 {
  printf("cpp call lua function failed ");
 }
 printf("cos(0.5)=%f ", lua_tonumber(L, -1));
 lua_pop(L, 1); 
 //压栈后设置一个lua可调用的全局函数名
 lua_pushcfunction(L, ShowMessage);
 lua_setglobal(L, "showmessage");
 //c调用lua
 lua_getglobal(L, "SHOWMESSAGE");
 lua_pcall(L, 0, 0, 0);
 printf("get the showmessage pushed value %f ", lua_tonumber(L, -1)); lua_close(L);}-----------------------------------------------region lua.lua
--Date
--此文件由[BabeLua]插件自动生成function COS(a)
print("called COS in lua script")
--lua调用c/c++
return DY_MATH.cos(a)
end
function SIN(a)
print("called SIN in lua script")
return DY_MATH.sin(a)
end
function SHOWMESSAGE()
showmessage()
end
--endregionLua 语言 15 分钟快速入门 http://www.linuxidc.com/Linux/2013-06/86582.htmLua程序设计(第2版)中文 PDF http://www.linuxidc.com/Linux/2013-03/81833.htmLua程序设计(第二版)阅读笔记 http://www.linuxidc.com/Linux/2013-03/81834.htmNetBSD 将支持用 Lua 脚本开发内核组件 http://www.linuxidc.com/Linux/2013-02/79527.htmCentOS 编译安装 Lua LuaSocket http://www.linuxidc.com/Linux/2011-08/41105.htmLua 的详细介绍:请点这里
Lua 的下载地址:请点这里本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-09/106908.htm