在Lua中重新定义print函数时出现问题。

我试图像 这个问题 描述的那样重新定义 print 函数。这是我的代码:

extern "C"{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}

#include <iostream>

using namespace std;

lua_State* L;

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)) {
            cout << "!!!" << lua_tostring(L, i) << "!!!" << endl;
        }
    }

    return 0;
}

static const struct luaL_Reg printlib [] = {
  {"print", l_my_print},
  {NULL, NULL} /* end of array */
};

extern int luaopen_luamylib(lua_State *L)
{
  lua_getglobal(L, "_G");
  luaL_register(L, NULL, printlib);
  lua_pop(L, 1);
}

int main(){
    L = luaL_newstate();
    luaL_openlibs(L);
    luaopen_luamylib(L);

    luaL_dostring(L, "print(\"hello\")");

    lua_close(L);

    return 0;
}

当我试图编译代码时,我得到:

$ g++ -I/usr/include/lua5.2 -o embed test.cpp -Wall -Wextra -llua5.2
test.cpp:28:1: error: elements of array ‘const luaL_reg printlib []’ have incomplete type
test.cpp:28:1: error: storage size of ‘printlib’ isn’t known
test.cpp: In functionint luaopen_luamylib(lua_State*)’:
test.cpp:33:34: error: ‘luaL_register’ was not declared in this scope
test.cpp:35:1: warning: no return statement in function returning non-void [-Wreturn-type]

有人能解释这里发生了什么吗?我缺少了某个库或其他东西吗?

更新

有人指出,这个结构体叫做 luaL_Reg 而不是 luaL_reg。这解决了我的第一个问题:

$ g++ -I/usr/include/lua5.2 -o embed test.cpp -Wall -Wextra -llua5.2
test.cpp: In functionint luaopen_luamylib(lua_State*)’:
test.cpp:33:34: error: ‘luaL_register’ was not declared in this scope
test.cpp:35:1: warning: no return statement in function returning non-void [-Wreturn-type]

点赞
用户52251
用户52251

第一个错误:应该是 luaL_Reg , 而不是 luaL_reg.

第二个错误:luaL_register 已经被弃用(在 Lua 5.2 中),只有在编译之前定义了 LUA_COMPAT_MODULE 才可以使用。你应该使用 luaL_setfuncs 来代替。

2012-09-12 14:41:56