gpt4 book ai didi

c - Journalctl 源中的无效包装函数

转载 作者:行者123 更新时间:2023-11-30 17:05:27 28 4
gpt4 key购买 nike

我最近在浏览journalctl的源代码,发现了一段我不太清楚的代码。

我正在谈论的部分就在这里: https://github.com/systemd/systemd/blob/9e83569d8ff219730912ecac441843b9531b079c/src/shared/logs-show.c#L1056

似乎他们想避免像这样的多次检查

r = sd_journal_add_match(...);
if (r < 0) {
//some error
}

作者:||输出在一起。

通过这样做是不是也可以实现:

r = sd_journal_add_match(...);
r |= sd_journal_add_match(...);
...

为什么要将输出包装在

(void) ( ... );

提前致谢。

最佳答案

首先

r |= sd_journal_add_match(...);

不等于

(r = sd_journal_add_match(j, "_UID=0", 0)) ||
(r = sd_journal_add_match(j, m2, 0)) ||

|= 运算符是一个按位或 运算符以及赋值操作(与 r = r | sd_() 相同),其中 ||逻辑或运算符。所有 sd_jourcal_ 函数都会执行,直到其中一个函数返回非零值。然后r包含这些非零值。这称为短路评估。

其次,我想这与我们(应该)将函数的返回值转换为 void 的原因相同,如果您对使用它们不感兴趣的话。例如:

(void)printf("Hello World");

这表明您现在 printf() 返回一个值,但您没有检查它们。通常您应该始终检查返回值:

if (printf("Hello World") < 0) {
// do some error handling here
}

简单写一下

printf("Hello World");

默默地忽略返回值,这是一个坏主意。我想,有一些针对关键软件的工具(比如 lint)可以检查这一点。

对于您提供的示例,|| 链的结果被转换为 void。如果没有强制转换,代码看起来很奇怪,因为计算了一个值,但没有分配。类似这样

f() || g(); // better (void)(f() || g());

关于c - Journalctl 源中的无效包装函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35268170/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com