这里虚空的目的是什么?

Mat*_*att 0 c++

我一直在查看journalctl代码并遇到了以下代码块.

如果在测试条件时存在非零结果,这似乎是退出一系列条件测试的简便方法.很聪明.

但我不确定void演员的目的.它是否抑制一些编译器输出?即使使用-Wall和,g ++也不关心-pedantic -pedantic-errors.

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")) {
   ...
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 5

  1. 禁止编译器警告此逻辑表达式的未使用结果.该logiocal或表达式是为其副作用及其短路评估特性而构建的.该代码的作者并不关心它的最终结果.编译器可能不够聪明,无法实现.它可能会警告最终结果被丢弃.
  2. 向人类读者传达代码作者放弃逻辑表达式结果的意图.

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

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