压入元素

简介: 压入元素

针对每一种能用 C 语言直接表示的 Lua 数据类型, C API 中都有一个对应的压栈函数

  1. 常量nil使用lua_pushnil
  2. 布尔值(在C语言中是整型)使用lua_pushboolean
  3. 双精度浮点数使用lua_pushnumber
  4. 整型使用lua_pushinteger
  5. 任意字符串(一个指向char的指针,外加一个长度)使用lua_pushlstring
  6. \0终止的字符串使用lua_pushstring
void lua_pushnil (lua_State *L);
void lua_pushboolean (lua_State *L, int bool);
void lua_pushnumber (lua_State *L, lua_Number n);
void lua_pushinteger (lua_State *L, lua_Integer n);
void lua_pushlstring (lua_State *L, const char *s, size_t len);
void lua_pushstring (lua_State *L, const char *s);


提示

由于历史原因, C API 中的术语 "number" 指的是双精度浮点类型


当然,也有向栈中压入 C 函数和用户数据的函数,见后续笔记。


类型 lua_Number 相当于 Lua 语言中的浮点数类型,默认为 double ,但可以在编译时配置 Lua ,让 lua_Numberfloat 甚至 long double 。类型 lua_Integer 相当于 Lua 语言中的整型,通常被定义为 long long ,即有符号 64 位整型。同样,要把 Lua 语言中的 lua_Integer 配置为使用 intlong 也很容易。如果使用 float-int 组合,也就是 32浮点型整型,即我们所说的精简Lua ( Small Lua ),对于资源受限的及其和硬件而言,相当高效。


提示

对于这些配置,详见头文件 luaconf.h


Lua 语言中的字符串不是以 \0 结尾的,他们可以包含任意的二进制数据。因此,将字符串压栈的基本函数 lua_pushlstring 需要一个明确的长度作为参数。对于以 \0 结尾的字符串,也可以使用函数 lua_pushstring ,该函数通过 strlen 来计算字符串的长度。 Lua 语言不会保留指向外部字符串(或指向除静态的 C 语言函数外的任何外部对象)的指针。对于不得不保留的字符串, Lua 要么生成一个内部副本,要么复用已有的字符串。因此,一旦上述函数返回,即使立刻释放或修改缓冲区也不会出现问题。

无论何时向栈内压入一个元素,我们都应该确保栈中有足够的空间。当 Lua 启动时,以及 Lua 调用 C 语言时,栈中至少会有 20空闲的位置slot )(头文件 lua.h 中将这个常量定义为 LUA_MINSTACK )。对于大多数情况,这个空间完全够用,所以我们一般无需考虑栈空间的问题。不过,有些任务可能会需要更多的栈空间,特别是循环向栈中压入元素时。在这些情况下,就需要调用函数 lua_checkstack 来检查栈中是否有足够的空间:

int lua_checkstack (lua_State *L, int sz);


这里, sz 是我们所需的额外栈位置的数量。如果可能,函数 lua_checkstack 会增加栈的大小,以容纳所需的额外空间;否则,该函数返回零。


辅助库也提供了一个高层函数来检查栈空间:

void luaL_checkstack(lua_State *L, int sz, const char *msg);


该函数类似于函数 lua_checkstack ,但是如果栈空间不能满足请求,该函数会使用指定的错误信息抛出异常,而不是返回错误码。

目录
相关文章
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
2381 0
编译x264出现错误:No working C compiler found.
编译x264出现错误:No working C compiler found.
1328 0
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
226 9
|
SQL 关系型数据库 MySQL
【Python】已解决:ERROR 1064 (42000): You have an error in your SQL syntax. check the manual that correspo
【Python】已解决:ERROR 1064 (42000): You have an error in your SQL syntax. check the manual that correspo
3474 0
|
开发工具 数据格式 XML
CEGUI::String类分析
CEGUI::String类算是一个不错的类,但是说实话,这个类让非英文国度的IT们不是很舒服。比如,自我们学习C++编程以来,我们一直使用这样的输出语句: std::cout
1099 0
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
626 22
|
6天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。