lua 调用 C -- 实例 C函数作为应用程序的一部分
参考:https://blog.csdn.net/vermilliontear/article/details/50947379
test2.c
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>static int l_sin(lua_State *L)
{
// 如果给定虚拟栈中索引处的元素可以转换为数字,则返回转换后的数字,否则报错。
double d = luaL_checknumber(L, 1);
lua_pushnumber(L, sin(d)); /* push result *//* 这里可以看出,C可以返回给Lua多个结果,
* 通过多次调用lua_push*(),之后return返回结果的数量。
*/
return 1; /* number of results */
}int main(void)
{
lua_State *L = luaL_newstate(); // 创建Lua状态机。
luaL_openlibs(L); // 打开Lua状态机"L"中的所有Lua标准库。/* 这两句话还有更简单的方法:
* lua_register(L, "mysin", l_sin)
* 将C函数"l_sin"定义为Lua的全局变量"mysin"。
* 其实现是如下宏:
* #define lua_register(L,n,f) \
* (lua_pushcfunction(L, f), lua_setglobal(L, n))
*/
lua_pushcfunction(L, l_sin); // 将C函数转换为Lua的"function"并压入虚拟栈。
lua_setglobal(L, "mysin"); // 弹出栈顶元素,并在Lua中用名为"mysin"的全局变量存储。const char* testfunc = "print(mysin(3.14 / 2))";
if(luaL_dostring(L, testfunc)) // 执行Lua命令。
printf("Failed to invoke.\n");
lua_close(L); // 关闭Lua状态机。return 0;
}
运行
lu@lu-virtualbox:~/project3/lua/lua->c$ gcc -o test.out test2.c -ldl -lm -Wall -I /usr/include/lua5.1 -llua5.1
lu@lu-virtualbox:~/project3/lua/lua->c$ ./test.out
0.99999968293183
总结
总的来讲,这是一份C程序。C程序里面创建了lua的运行环境,即可运行lua代码。lua代码里面又调用了C函数(调用之前已将C函数转换为了lua的函数并压入了虚拟栈)。
本来的C函数l_sin() 被 搞搞搞 搞成了lua的函数mysin