【发布时间】:2011-07-06 18:00:57
【问题描述】:
一位同事告诉我他花了很多时间调试比赛条件。罪魁祸首竟然是这样的:
void foo()
{
ScopedLock(this->mutex); // Oops, should have been a named object.
// Edit: added the "this->" to fix compilation issue.
// ....
}
为了防止这种情况再次发生,他在定义ScopedLock类之后创建了如下宏:
#define ScopedLock(...) Error_You_should_create_a_named_object;
这个补丁运行良好。
有没有人知道任何其他有趣的技术来防止这个问题?
【问题讨论】:
-
“这个补丁运行良好”——直到你开始使用命名空间。
-
@Steve:只要您在另一个命名空间中没有任何名为
ScopedLock的东西,它也可以在命名空间中正常工作。宏仍然可以使用命名空间限定(因为它无论如何都会产生错误)。 -
@Jeremiah:命名空间的唯一目的是允许您在另一个命名空间中拥有名为
ScopedLock的东西。或者具体来说,编写代码以便您不在乎其他人是否喜欢他们的类(函数或全局变量)名称ScopedLock的外观。 -
@Steve:是的,这是真的,如果在另一个命名空间中有任何名为
ScopedLock的东西,宏会中断。 -
另见stackoverflow.com/questions/914861/…,它可能是重复的,也可能不是重复的。
标签: c++