24.2.1 压入元素

API有一系列压栈的函数,它将每种可以用C来描述的Lua类型压栈:空值(nil)用lua_pushnil,数值型(double)用lua_pushnumber,布尔型(在C中用整数表示)用lua_pushboolean,任意的字符串(char*类型,允许包含'\0'字符)用lua_pushlstringC语言风格(以'\0'结束)的字符串(const 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函数和userdata值压入栈的函数,稍后会讨论到它们。

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);

它检测栈上是否有足够你需要的空间(稍后会有关于它更多的信息)。


相关链接:
lua程序设计目录 - 中国lua开发者 - lua论坛