2017-07-27 7 views
0

私はjournalctlコードを見て、次のコードブロックを見つけました。ボイドキャストの目的は何ですか?

これは、条件がテストされているときに0以外の結果がある場合、一連の条件テストから抜け出すための簡略な方法のようです。かなり賢い。

しかし、キャストvoidの目的は不明です。いくつかのコンパイラ出力を抑制するのですか? g ++はいずれも-Wall-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")) { 
    ... 
+1

可能性のある迷信です。または警告システムが壊れているコンパイラ。 – SergeyA

+2

クラップ・コードをさらにクレイジーにするには?この "MESSAGE_ID = fc2e22bc6ee647b6b90729ab34a250b1"のような文字列を埋め込むものは、ひどいものです。 –

+0

@NeilButterworth - 多少は同意します。誰がfc2e22bc6ee647b6b90729ab34a250b1 = coredumpを考えたでしょうか? systemdは常にかなり議論の余地があった。 – Matt

答えて

5
  1. この論理式の未使用の結果についてのコンパイラの警告を抑制することができます。この論理的または表現は、副作用とその短絡評価プロパティーのために構築されています。コードの作成者は最終的な結果を気にしません。コンパイラはそれを実現するほどスマートではないかもしれません。破棄される最終結果について警告することがあります。
  2. 論理式の結果を破棄するコードの作成者の意図を人間の読者に伝える。

voidへの明示的な変換は、その意図(コンパイラと人間の読者の両方)を伝える一般的に受け入れられたイディオムです。

P.S. ||のこのアプリケーションは、「古典的な」Cスタイルの式プログラミングにおける分岐の一例です。ここで説明しましたが、https://stackoverflow.com/a/1618867/187690

+0

この場合のみ、これがコンパイラと読者の両方にどのように使用されているかが明確です。 – SergeyA

+1

ここで、その表現のポイントは、ネストされた 'if'のトンを持たずに、短絡評価を利用してソートの「フォールバックチェーン」を持つことです。表現の最終結果は興味深いものではありません。 –

関連する問題