重定向/重新定义嵌入式Lua中的print()函数。

我在我的 C++ 应用程序中嵌入了 Lua。我想要重定向 print 语句(或者可能只是重新定义 print 函数?),这样我就可以将计算得到的表达式显示在其他地方。

最佳的方法是什么:重定向还是重新定义 print() 函数?

如果有任何演示如何完成此操作的代码片段/指针,将不胜感激。

原文链接 https://stackoverflow.com/questions/4508119

点赞
stackoverflow用户501459
stackoverflow用户501459

请参阅 lbaselib.c 中的 luaB_print 函数。那里的注释如下:

/* 如果需要,您可以定义自己的 'print' 函数,按照这个模型但是更改 `fputs` 来将字符串放置在适当的地方(例如控制台窗口或日志文件)。*/

您可以编辑该函数或定义一个新函数。这样做的好处是简单且便携,但它不会处理 io.write(您可能关心或不关心)。

重定向 IO 不会是平台具体的(例如在 Windows 中的 SetStdHandle),但会处理 printio.write,而不必重新定义它们。

2010-12-22 10:31:53
stackoverflow用户107090
stackoverflow用户107090

编写你自己的 C 或 Lua 函数并重新定义 print

2010-12-22 10:45:34
stackoverflow用户298661
stackoverflow用户298661

你可以通过 Lua 脚本简单地重新定义 print

local oldprint = print
print = function(...)
    oldprint("In ur print!");
    oldprint(...);
end
2010-12-22 14:15:39
stackoverflow用户83497
stackoverflow用户83497

你可以在 C 中重新定义 print 语句:

static int l_my_print(lua_State* L) {
    int nargs = lua_gettop(L);

    for (int i=1; i <= nargs; i++) {
        if (lua_isstring(L, i)) {
            /* 弹出下一个参数并使用 lua_tostring(L, i) 进行打印 */
        }
        else {
        /* 如果需要,可以对非字符串参数做一些操作 */
        }
    }

    return 0;
}

然后在全局表中注册它:

static const struct luaL_Reg printlib [] = {
  {"print", l_my_print},
  {NULL, NULL} /* 数组末尾 */
};

extern "C" int luaopen_luamylib(lua_State *L)
{
  lua_getglobal(L, "_G");
  // luaL_register(L, NULL, printlib); // 适用于 Lua 版本 < 5.2
  luaL_setfuncs(L, printlib, 0);  // 适用于 Lua 版本 5.2 或更高版本
  lua_pop(L, 1);
}

由于你在使用 C++,因此需要使用 extern "C" 引用你的文件。

2010-12-22 22:12:17
stackoverflow用户774082
stackoverflow用户774082

你可以重新定义下面的宏:

lua_writestring
lua_writeline
lua_writestringerror

按你喜欢的方式重新定义它们。 我不确定这是在哪个Lua版本中引入的,但在5.3版本中可以使用。

请查看您的lauxlib.h或luaconf.h文件。

2016-10-13 15:34:54