第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目


24.2.1 – 压入元素

API 为可在 C 中表示的每种 Lua 类型提供一个压入函数:lua_pushnil 适用于常量 nillua_pushnumber 适用于数字(double),lua_pushboolean 适用于布尔值(在 C 中为整数),lua_pushlstring 适用于任意字符串(char *),lua_pushstring 适用于以零结尾的字符串

    void lua_pushnil (lua_State *L);
    void lua_pushboolean (lua_State *L, int bool);
    void lua_pushnumber (lua_State *L, double n);
    void lua_pushlstring (lua_State *L, const char *s,
                                        size_t length);
    void lua_pushstring (lua_State *L, const char *s);
还有一些函数用于在堆栈上压入 C 函数和用户数据值;我们将在后面讨论它们。

Lua 中的字符串不是以零结尾的;因此,它们可以包含任意二进制数据并依赖于明确的长度。将字符串压入堆栈的官方函数是 lua_pushlstring,它需要一个明确的长度作为参数。对于以零结尾的字符串,您还可以使用 lua_pushstring,它使用 strlen 来提供字符串长度。Lua 永远不会保留指向外部字符串(或任何其他对象)的指针,但 C 函数除外,它们始终是静态的。对于任何必须保留的字符串,Lua 都会制作一个内部副本或重复使用一个副本。因此,一旦这些函数返回,您就可以释放或修改缓冲区。

每当您将元素压入堆栈时,您都有责任确保堆栈有空间容纳它。记住,您现在是 C 程序员;Lua 不会宠坏您。当 Lua 启动以及任何时候 Lua 调用 C 时,堆栈至少有 20 个空槽(此常量在 lua.h 中定义为 LUA_MINSTACK)。这对于大多数常见用途来说已经足够了,所以我们通常甚至不会考虑这一点。但是,某些任务可能需要更多堆栈空间(例如,调用具有可变数量参数的函数)。在这种情况下,您可能需要调用

    int lua_checkstack (lua_State *L, int sz);
它会检查堆栈是否具有满足您需求的足够空间。(稍后会详细介绍。)