gpt4 book ai didi

c++ - 一个c/c++语句只有一个变量名,有什么具体的用途吗?

转载 作者:太空狗 更新时间:2023-10-29 23:30:58 25 4
gpt4 key购买 nike

曾经看到一段代码如下,

/** 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 在它的 block 中定义了一个变量 ____lock

这里的问题是:__lock;这句话(在abcd::MakeLock(x);之后)是干什么用的?注意这句话只包含变量名。

最佳答案

图像你有这个代码:

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
}

关于c++ - 一个c/c++语句只有一个变量名,有什么具体的用途吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11499524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com