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_ON一起END_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禁用特定警告的 s 根本不可移植,并且 Internet 充满了避免它们的变通方法,就像这样(它似乎可以跨编译器移植)。

{
    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在块中的其他任何地方都没有使用,因此编译器会给你一个关于“未使用的变量__lock”的警告。因此,__lock;可能会添加该语句来抑制此警告。值得一提的是,这是 Herb Sutter 在他的《C++ 编码标准:101 条规则、指南和最佳实践》一书中推荐的一种警告抑制方式

对不起,如果我的解释有点混乱,希望你能得到大致的想法。

于 2012-07-16T07:18:16.177 回答