使用| =而不是=的特定原因

丽考

我目前正在查看Linux内核(热管理)中的一些代码。在某些地方,有一个用于指示错误的返回值,该值在函数开始时设置为0。然后,在调用可能失败的函数时,使用|=代替将其设置为新值=这是一个例子:

int ti_bandgap_read_temperature(struct ti_bandgap *bgp, int id,
                int *temperature)
{
    u32 temp;
    int ret;

    ret = ti_bandgap_validate(bgp, id);
    if (ret)
        return ret;

    spin_lock(&bgp->lock);
    temp = ti_bandgap_read_temp(bgp, id);
    spin_unlock(&bgp->lock);

    ret |= ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
    if (ret)
        return -EIO;

    *temperature = temp;

    return 0;
}

的定义ti_bandgap_validate是:

/**
 * ti_bandgap_validate() - helper to check the sanity of a struct ti_bandgap
 * @bgp: struct ti_bandgap pointer
 * @id: bandgap sensor id
 *
 * Checks if the bandgap pointer is valid and if the sensor id is also
 * applicable.
 *
 * Return: 0 if no errors, -EINVAL for invalid @bgp pointer or -ERANGE if
 * @id cannot index @bgp sensors.
 */
static inline int ti_bandgap_validate(struct ti_bandgap *bgp, int id)

因此,如果我的推理是正确的,则在调用时ti_bandgap_adc_to_mcelsius(),的值ret必须为0(否则该函数将已经退出)。那么,为什么在|=这里使用而不是=用全零的模式执行“或”操作只会返回正常模式。这是针对通常情况的某种优化,即该函数没有返回任何失败(即return value 0)吗?还是我缺少其他区别?该代码在ARM体系结构上运行,因此可能必须对该平台进行特定的优化。

埃德温·巴克

在这种情况下,没有理由使用,|=但是,如果您要跟踪许多可能出错的函数,并在它们出错时作为返回码返回,则模式为

boolean error = false

error |= doFirstStep(...);
error |= doSecondStep(...);
error |= doThirdStep(...);

if (error) {
  printf("error occurred: %s\n", strerror(errno));
}

它是C语言中较少使用的模式,偶尔在与C语言有某种相似性的语言中使用。在C语言中,大量的C库函数在成功操作后都会返回“错误代码”,该错误代码通常为0。

使用此模式时,用户将返回零作为成功条件。这意味着上面提到的log_and_recover()可能将错误消息从error.ha静态变量中拉出,这是C#include <error.h>例程常见的

----继续说明为什么它经常在int字段上使用----

您还会看到带有int错误的模式。

int error = 0; // or a variable that's defined to zero

error |= doFirstStep(...);
error |= doSecondStep(...);
error |= doThirdStep(...);

if (error != 0) {
  ... some error handling ...
}

当您看到此内容时,它与上面的想法相同,但是开发人员组合了两种模式。经常用于打包配置参数的位字段模式用于打包多种错误。通常,发生这种情况时,您会找到类似于以下内容的错误列表

#define ERROR_NO_DISK  (1<<1);
#define ERROR_NO_NETWORK (1<<2);
#define ERROR_NO_SANITY (1<<3);

对于大多数项目来说,返回多个错误并将它们作为一个错误处理是非常不明智的。但是有时在错误抑制很重要的情况下才这样做。例如,如果您无法将消息从客户端传输到主机,则可能会抑制各种“打开套接字失败”,“无法写入套接字”,“无法复制到缓冲区”等。变成通用的“发送X失败”。一方面,整个顶层工作流程都失败了,如果需要,为什么仍然可以找到原因的详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用array.resize而不是redim的原因

来自分类Dev

使用 Type 而不是特定的类

来自分类Dev

使用argv [argc + 1]而不是argv []的原因是什么

来自分类Dev

使用通用迭代器而不是特定的列表类型

来自分类Dev

加载特定的中间件,而不是使用next();

来自分类Dev

使用Java更新MongoDB中的特定字段而不是整个文档

来自分类Dev

使用settings.CellEditorInitialize在特定的列而不是整个网格上

来自分类Dev

更新特定内容,而不是使用nodejs刷新整个页面

来自分类Dev

Django:使用GET(而不是PATCH)更新特定字段

来自分类Dev

使用settings.CellEditorInitialize在特定的列而不是整个网格上

来自分类Dev

在mongodb上使用find()获得可读的{..}而不是特定的集合

来自分类Dev

XSD使用的xs:group元素的顺序不是特定的

来自分类Dev

使用 JAX-RS 而不是特定于实现的

来自分类Dev

是什么原因导致尝试在React中使用Vanilla Tilt的原因是“ TypeError:Object(...)不是一个函数”?

来自分类Dev

使用空链接调用js而不是其他html元素的原因

来自分类Dev

由于平台遗留原因,请使用sleep而不是thread.join()

来自分类Dev

是否出于技术原因在Rails URL中不使用_url而不是_path?

来自分类Dev

在属性中使用Func <T>而不是简单T的原因可能是什么

来自分类Dev

使用空格而不是制表符进行缩进的客观原因?

来自分类Dev

人们在get中使用属性的原因是什么?组; 而不是田地?

来自分类Dev

在React中使用数据URI而不是小于10kb的图像的路径的原因是什么?

来自分类Dev

XAML控件使用“可见性”类型而不是普通的“布尔”的实际原因是什么?

来自分类Dev

当foo被声明为可变的时,要求使用&mut foo而不是&foo的原因是什么?

来自分类Dev

为什么CSS库使用通用类和特定类而不是仅使用特定类

来自分类Dev

使用具有特定簇的 sklearn 进行 K 折叠,而不是以特定大小拆分

来自分类Dev

为什么font-awesome建议使用<i>元素而不是<span>元素?有具体原因可取吗?

来自分类Dev

使用HTML而不是CSHTML

来自分类Dev

使用多态而不是Switch

来自分类Dev

使用理解而不是for循环

Related 相关文章

  1. 1

    使用array.resize而不是redim的原因

  2. 2

    使用 Type 而不是特定的类

  3. 3

    使用argv [argc + 1]而不是argv []的原因是什么

  4. 4

    使用通用迭代器而不是特定的列表类型

  5. 5

    加载特定的中间件,而不是使用next();

  6. 6

    使用Java更新MongoDB中的特定字段而不是整个文档

  7. 7

    使用settings.CellEditorInitialize在特定的列而不是整个网格上

  8. 8

    更新特定内容,而不是使用nodejs刷新整个页面

  9. 9

    Django:使用GET(而不是PATCH)更新特定字段

  10. 10

    使用settings.CellEditorInitialize在特定的列而不是整个网格上

  11. 11

    在mongodb上使用find()获得可读的{..}而不是特定的集合

  12. 12

    XSD使用的xs:group元素的顺序不是特定的

  13. 13

    使用 JAX-RS 而不是特定于实现的

  14. 14

    是什么原因导致尝试在React中使用Vanilla Tilt的原因是“ TypeError:Object(...)不是一个函数”?

  15. 15

    使用空链接调用js而不是其他html元素的原因

  16. 16

    由于平台遗留原因,请使用sleep而不是thread.join()

  17. 17

    是否出于技术原因在Rails URL中不使用_url而不是_path?

  18. 18

    在属性中使用Func <T>而不是简单T的原因可能是什么

  19. 19

    使用空格而不是制表符进行缩进的客观原因?

  20. 20

    人们在get中使用属性的原因是什么?组; 而不是田地?

  21. 21

    在React中使用数据URI而不是小于10kb的图像的路径的原因是什么?

  22. 22

    XAML控件使用“可见性”类型而不是普通的“布尔”的实际原因是什么?

  23. 23

    当foo被声明为可变的时,要求使用&mut foo而不是&foo的原因是什么?

  24. 24

    为什么CSS库使用通用类和特定类而不是仅使用特定类

  25. 25

    使用具有特定簇的 sklearn 进行 K 折叠,而不是以特定大小拆分

  26. 26

    为什么font-awesome建议使用<i>元素而不是<span>元素?有具体原因可取吗?

  27. 27

    使用HTML而不是CSHTML

  28. 28

    使用多态而不是Switch

  29. 29

    使用理解而不是for循环

热门标签

归档