【问题标题】:What's the purpose of the void cast here? [duplicate]在这里施放虚空的目的是什么? [复制]
【发布时间】:2017-07-27 21:23:28
【问题描述】:

我一直在查看 journalctl 代码,发现了以下代码块。

如果在测试条件时出现非零结果,这似乎是退出一系列条件测试的一种简写方式。很聪明。

但我不确定void 演员表的目的。是为了抑制一些编译器输出吗?即使使用-Wall-pedantic -pedantic-errors,g++ 也不在乎。

m1 = strjoina("_SYSTEMD_UNIT=", unit);
m2 = strjoina("COREDUMP_UNIT=", unit);
m3 = strjoina("UNIT=", unit);
m4 = strjoina("OBJECT_SYSTEMD_UNIT=", unit);

(void)(
  /* Look for messages from the service itself */
  (r = sd_journal_add_match(j, m1, 0)) ||

  /* Look for coredumps of the service */
  (r = sd_journal_add_disjunction(j)) ||
  (r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0)) ||
  (r = sd_journal_add_match(j, "_UID=0", 0)) ||
  (r = sd_journal_add_match(j, m2, 0)) ||

  /* Look for messages from PID 1 about this service */
  (r = sd_journal_add_disjunction(j)) ||
  (r = sd_journal_add_match(j, "_PID=1", 0)) ||
  (r = sd_journal_add_match(j, m3, 0)) ||

  /* Look for messages from authorized daemons about this service */
  (r = sd_journal_add_disjunction(j)) ||
  (r = sd_journal_add_match(j, "_UID=0", 0)) ||
  (r = sd_journal_add_match(j, m4, 0))
);

f (r == 0 && endswith(unit, ".slice")) {
   ...

【问题讨论】:

  • 可能是迷信。或警告系统损坏的编译器。
  • 让垃圾代码更垃圾?任何嵌入诸如“MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1”这样的字符串的东西都非常糟糕。
  • @NeilButterworth - 有点同意。谁会想到 fc2e22bc6ee647b6b90729ab34a250b1= coredump? systemd 总是很有争议。

标签: c++


【解决方案1】:
  1. 禁止编译器警告有关此逻辑表达式的未使用结果。这个逻辑或表达式是为它的副作用和它的短路评估特性而构建的。代码的作者并不关心它的最终结果。编译器可能不够聪明,无法意识到这一点。它可能会警告最终结果被丢弃。
  2. 向人类读者传达代码作者放弃逻辑表达式结果的意图。

void 的显式转换是一种普遍接受的习语,它传达了这种意图(对编译器和人类读者)。

附: || 的这个应用程序是“经典”C 风格表达式编程中分支的一个示例,正如我在这里描述的那样:https://stackoverflow.com/a/1618867/187690

【讨论】:

  • 只有在这种情况下,编译器和阅读器才清楚它的用途。
  • 是的,这有助于理解该表达式的重点是利用短路评估来获得某种“后备链”,而无需大量嵌套的ifs。表达式的最终结果并不有趣。
猜你喜欢
  • 2020-11-23
  • 2011-08-15
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多