在lua中实现printf
来源:互联网 发布:c语言case语句用法 编辑:程序博客网 时间:2024/04/19 09:20
本文讨论如何在lua中实现printf。学习的目的是为了进一步了解C函数和lua之间利用栈传值的过程。在lua中printf的功能等于string.format + io.wirte,前者用于格式化字符串,后者用于输出。文中的代码来自于lua官网。
用lua代码实现为:
printf= function(s, ...) return io.write(s:format(...))endprintf("%s\n", "Hello World!")
在C语言中实现为:
#include <Windows.h>extern "C"{#include <lua.h>#include <lauxlib.h>#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <lualib.h>#include <math.h>#include <limits.h>}static int l_printf (lua_State *L) { lua_pushvalue(L, lua_upvalueindex(2)); //将format函数放置栈顶 lua_insert(L, 1); //将format函数插入至栈低,此时的栈内容为:string.format, arg1, arg2, ... lua_call(L, lua_gettop(L) - 1, 1); //lua中的函数string.format和C语言中的printf是一样的,所以lua_gettop(L) - 1就是参数的个数。 //栈中只有:result lua_pushvalue(L, lua_upvalueindex(1));//将write函数放置栈顶,栈中的内容为:result, io.write lua_pushvalue(L, -2); //将io.write移到result之前,使result作为write的参数 lua_call(L, 1, 0); //调用write(result) return 0;}int luaopen_printf (lua_State *L) { lua_getglobal(L, "io"); lua_getglobal(L, "string"); lua_pushliteral(L, "write");//lua_upvalueindex(1)。等同于lua_pushstring,作用是将一个字符串放置于栈顶。 lua_gettable(L, -3); //-3是io在栈中的索引,在io table中查找key=write的项。如果找到,就将该项放入栈中,在放入之前删除之前压入的字符串"write" lua_pushliteral(L, "format");//lua_upvalueindex(2) lua_gettable(L, -3); //将l_printf放置栈顶 lua_pushcclosure(L, l_printf, 2);//2表示为:在函数l_printf中,可以向上访问2个luaopen_printf栈中的值,即函数write和函数format。 //将栈顶元素(既l_printf)命名为printf,lua可以通过printf调用l_printf lua_setglobal(L, "printf"); return 0;}int main(){ lua_State *L = luaL_newstate(); luaL_openlibs(L); luaopen_printf(L); lua_pushstring(L, "lua is great!"); lua_setglobal(L, "lua"); //设置一个命名为lua的全局变量,其中的内容为字符串"lua is great!" bool result = luaL_loadfile(L, "fordebug.lua"); if(!result) result = lua_pcall(L, 0, 0, 0); lua_close(L); system("pause"); return 0;}fordebug.lua中的代码:
printf("%s\n", lua) --> lua is great!
- 在lua中实现printf
- MFC实现lua printf函数
- 在Lua中实现StringBuffer
- 在nand boot中自己实现printf
- 在 Lua 中实现面向对象
- 在 Lua 中实现面向对象
- 自己动手,实现在kernel函数中printf()!(转)
- 如何在printf中换行
- printf中va_list的实现
- 在Lua中实现汇编中的跳转语句Goto
- 在Lua表中实现迭代values
- 在LUA中使用GETTEXT实现多语言支持
- 在LUA中使用GETTEXT实现多语言支持
- 杂谈篇-用lua在nginx中实现一个WAF
- 在lua中实现类似python的decorator
- lua中实现倒计时
- Lua 中实现类
- lua中实现倒计时
- sed初学
- oracle 增加列(字段)
- mina教程
- Storm 实时性分析
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构
- 在lua中实现printf
- MYSQL SHOW FULL PROCESSLIST\G
- Poor Man’s Visual Studio Cppcheck Integration
- python 专题十一 基本知识
- Linux命令tree - 以树状图列出目录的内容
- 封80端口应对策略 Nginx反向代理For WIN2003超级傻瓜式配置
- Android蓝牙开发浅谈
- 110901 Bicoloring
- Android MID 3G 移植