2

以下のようなコードの断片を見たことがありますが、

/** Starts a synchronized block
*
*   This macro starts a block synchronized on its argument x
*   Note that the synchronized block defines a scope (i.e. { })
*   All variables declared in it will live inside this block only
*/
#define SYNCHRONIZE_ON(x) { \
                const abcd::LockBase & __lock = \
                                abcd::MakeLock(x); __lock;

/** Ends a synchronized block */
#define END_SYNCHRONIZE   }

SYNCHRONIZE_ONEND_SYNCHRONIZE一緒に使用して、オブジェクトを同期します。マクロは、そのブロックでSYNCHRONIZE_ON変数____lockを定義します。

ここでの質問は次のとおりです: (の後の)文は何のためのものですか? __lock;abcd::MakeLock(x);この文は変数名だけで構成されていることに注意してください。

4

2 に答える 2

9

このコードがある画像:

SYNCHRONIZE_ON(myVariable)
   // Do stuff
END_SYNCHRONIZE

次のように書き換えられます。

{
    abcd::LockBase& __lock = abcd::MakeLock(myVariable);
    __lock;

    // Do stuff
}

実際には、__lock変数はコードでは使用されません。スコープ外になるときにクリティカル セクションを破棄するためだけに存在します (それが使用するものである場合)。

そのコードの問題は、宣言されているが使用されていないため、大量の警告が生成されることです__lock。そのステートメントは、これらの警告を防ぐためにあり、コンパイラによって最適化されます (副作用がないため)。コンパイラが実際に実行するのは次のとおりです。

{
    abcd::LockBase& __lock = abcd::MakeLock(myVariable);

    // Do stuff
}

編集
このコードは「未使用の変数」警告を抑制する必要がありますが、「式は効果がありません」警告から保存されない場合があります。pragma特定の警告を無効にすることはまったく移植性がなく、インターネットには、このようにそれらを回避するための回避策がたくさんあります (コンパイラ間でかなり移植性があるようです)。

{
    abcd::LockBase& __lock = abcd::MakeLock(myVariable);
    (void)__lock;

    // Do stuff
}

この場合、より良い解決策は、次のように、宣言を分割して取得をロックすることです。

{
    abcd::LockBase& __lock = abcd::MakeLock(myVariable);
    __lock.Acquire();

    // Do stuff
}
于 2012-07-16T07:11:28.527 に答える
4

このコードから、何が何であるかを推測するのは非常に困難です__lock。一般に、 で始まる名前は絶対に付けないでください__。これらはコンパイラ開発者向けに予約されているためです。

あなたの場合、 __lock はマクロ(可能性が高い)またはグローバル変数(可能性は低い)のいずれかです。

次の行もあります const abcd::LockBase & __lock__lockほとんどの場合、この行はクラスのオブジェクトへの参照を宣言していますLockBase

ここで const abcd::LockBase & __lock = abcd::MakeLock(x);は、関数呼び出しを実行するだけです。ただし、ブロック内の他の場所では使用されていないため、コンパイラは「未使用の変数__lock」に関する警告を表示します。したがって、この警告を抑制するためにステートメントが追加されている可能性があります。これは、Herb Sutter が著書「C++ Coding Standards: 101 Rules, Guidelines, and Best Practices」で推奨している警告抑制の方法です。__lock__lock;

説明がややこしくて申し訳ありませんが、おおまかにご理解いただければ幸いです。

于 2012-07-16T07:18:16.177 に答える