我目前正在使用从C到Rust的重构bzip2 decompression function,并在BZ2_decompress函数中遇到了一段特殊的代码,这让我感到困惑.这个函数是decompress.i文件的一部分,我在编译bzip2的过程中使用了save-temps选项后获得了这个文件.

下面的代码IS a snippet from decompress.i涉及一个处理解压缩过程中不同状态的Switch-Case语句.我注意到,在这条语句中,特别是从case 10case 50,在检测到每个 case 之后,状态被显式设置为它刚刚匹配的相同值.例如:

switch (s->state) {
  case 10:
    s->state = 10;
    // ... (other code)
}

给你the complete code snippet from decompress.i from case 10 till case 50块.

我正在努力理解这种模式背后的理由.为什么必须将s->state显式设置为与其刚刚判断的值相同的值?这在某些情况下是常见的做法,还是在BZ2_decompress功能的上下文中服务于特定目的?

任何见解或解释都将不胜感激,因为我渴望了解在C编程中处理此类情况所涉及的最佳实践和微妙之处.

推荐答案

由于存在故障,因此状态值也可能是前一个状态(或之前的状态).这会将其重置为该状态的值,因此当我们下次进入switch时,我们将立即转到我们离开的状态.

我猜前case个人并不真的需要这个,它被留在那里是因为所有其他 case 都有它.

C++相关问答推荐

在C++中使用函数指针的正确语法

限制不同类型的限定符

用C++从外部ELF符号读取值

tick.q中的Kdb+键控表语法

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

For循环不会迭代所有字符串字符吗?(初学者问题)

Zlib:解压缩大文件导致";无效代码长度设置";错误

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

可以';t从A9G模块拨打电话

挥发性语义的形式化理解

如何使crc32的结果与cksum匹配?

If语句默认为true

GCC认为这是一个VLA是对的吗?

如何在Rust中处理C的longjmp情况?

仅使用其内存地址取消引用 C 中的 struct

strided memcpy(3) 在 libvpx 中如何工作

有没有一种方法可以减少舍入误差?

从 C 调用 Lua 函数:最小示例导致 LUA_ERRRUN

持续增加 eBPF 中的 map 标识

将优化遗漏的代码:mov al,[mem]改写为位域将一个新的低字节插入整数