API有一些列压栈的函数,它将每种可以用C来描述的Lua类型压栈:空值(nil)用lua_pushnil,数值(double)用lua_pushnumber,布尔型(在C中用整数表示)用lua_pushboolean,任意的字符串(char*类型,允许包含'\0'字符)用lua_pushlstring,C语言风格(以'\0'结束)的字符串(const char*)用lua_pushstring
void lua_pushlstring(lua_State *L, const cahr* s, size_t length);
lua中的字符串不是以零为结束符的;它们依赖于一个明确的长度,因此可以包含任意的二进制数据。将字符串压入串的正式函数是lua_pushlstring,它要求一个明确的长度作为参数。对于以零结束的字符串,你可以用lua_pushstring(它用strlen来计算字符串长度)。lua从来不保持一个指向外部字符串(或任何其他对象,除了C函数--它总是静态指针)的指针。对于它保持的所有字符串,lua要么做一份内部的拷贝要么重新利用已经存在的字符串。
lua_tostring函数返回一个指向字符串的内部拷贝的指针。你不能修改它。当一个C函数返回后,lua会清理它的栈,所以永远不要将指向lua字符串的指针保存到访问他们的外部函数中。
lua_pcall(L,narg,nresult,errFun)函数表示运行栈顶的函数并将nresult个返回值一次压入栈顶,在将结果入栈之前,lua_pcall会将栈内的函数和参数移除。如果函数返回多个结果,第一个结果被第一个入栈,因此如果有n个返回结果,第一个返回结果在栈中的位置为-n,最后一个返回结果在栈中的位置为-1。如果lua_pcall运行时出现错误,lua_pcall会返回一个非0的结果。另外,他将错误信息入栈(仍然会先将函数和参数从栈中移除)。在将错误信息入栈之前,如果指定了错误处理函数,lua_pcall毁掉用错误处理函数。使用lua_pcall的最后一个参数来指定错误处理函数,0代表没有错误处理函数,也就是说最终的错误信息就是原始的错误信息。否则,那个参数应该是一个错误函数被加载的时候在栈中的索引,注意,在这种情况下,错误处理函数必须要在被调用函数和其参数入栈之前入栈。
void lua_pushlstring(lua_State *L, const cahr* s, size_t length);
lua中的字符串不是以零为结束符的;它们依赖于一个明确的长度,因此可以包含任意的二进制数据。将字符串压入串的正式函数是lua_pushlstring,它要求一个明确的长度作为参数。对于以零结束的字符串,你可以用lua_pushstring(它用strlen来计算字符串长度)。lua从来不保持一个指向外部字符串(或任何其他对象,除了C函数--它总是静态指针)的指针。对于它保持的所有字符串,lua要么做一份内部的拷贝要么重新利用已经存在的字符串。
lua_tostring函数返回一个指向字符串的内部拷贝的指针。你不能修改它。当一个C函数返回后,lua会清理它的栈,所以永远不要将指向lua字符串的指针保存到访问他们的外部函数中。
lua_pcall(L,narg,nresult,errFun)函数表示运行栈顶的函数并将nresult个返回值一次压入栈顶,在将结果入栈之前,lua_pcall会将栈内的函数和参数移除。如果函数返回多个结果,第一个结果被第一个入栈,因此如果有n个返回结果,第一个返回结果在栈中的位置为-n,最后一个返回结果在栈中的位置为-1。如果lua_pcall运行时出现错误,lua_pcall会返回一个非0的结果。另外,他将错误信息入栈(仍然会先将函数和参数从栈中移除)。在将错误信息入栈之前,如果指定了错误处理函数,lua_pcall毁掉用错误处理函数。使用lua_pcall的最后一个参数来指定错误处理函数,0代表没有错误处理函数,也就是说最终的错误信息就是原始的错误信息。否则,那个参数应该是一个错误函数被加载的时候在栈中的索引,注意,在这种情况下,错误处理函数必须要在被调用函数和其参数入栈之前入栈。