我目前正在使用从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++相关问答推荐

Zig将std.os.argv转换为C类型argv

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

Tiva TM4C123GXL的I2C通信

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么即使在强制转换时,此代码也会溢出?

`#if`条件中是否允许`sizeof`?

加密解密工作正常,但返回错误0x80090005

无法在OpenGL上绘制三角形

在C中创建任意类型的只读指针参数

按长度对argv中的单词进行排序

使用%f格式说明符打印整数值

C语言中神秘的(我认为)缓冲区溢出

为什么WcrTomb只支持ASCII?

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

try 查找带有指针的数组的最小值和最大值

C中的空指针是什么(_N)?

将char*数组深度复制到 struct 中?

未为同一文件中的函数执行DirectFunctionCall

将指针的地址加载到寄存器内联拇指组件中

使用 SDL2 的 C 程序中的内存泄漏