今天在为一位同事做代码审查时,我看到了一件奇怪的事情。他用大括号括起了他的新代码,如下所示:
Constructor::Constructor()
{
existing code
{
New code: do some new fancy stuff here
}
existing code
}
如果有的话,结果会是什么呢?这么做的原因可能是什么?这个习惯是从哪里来的?
编辑:
基于输入和下面的一些问题,我觉得我必须在问题中添加一些,即使我已经标记了答案。
环境是嵌入式设备。有很多用C++包装的遗留C代码。有很多使用C语言的C++开发人员。
这部分代码中没有关键部分。我只在代码的这一部分看到过它。没有完成主要的内存分配,只设置了一些标志,并进行了一些微调。
用大括号括起来的代码类似于:
{
bool isInit;
(void)isStillInInitMode(&isInit);
if (isInit) {
return isInit;
}
}
(不要介意代码,只需使用大括号...;) )在花括号之后,还有一些位旋转、状态检查和基本信令。
我和他谈过,他的动机是限制变量的范围,命名冲突,以及其他一些我不能真正了解的东西。
从我的观点来看,这似乎相当奇怪,我认为花括号不应该出现在我们的代码中。我在所有的答案中看到了一些很好的例子,解释了为什么可以用大括号括起代码,但你不应该把代码分成几个方法吗?
发布于 2012-03-14 22:41:54
它有时很好,因为它给了你一个新的作用域,在那里你可以更“干净”地声明新的(自动)变量。
在C++
中,这一点可能并不那么重要,因为您可以在任何地方引入新变量,但这可能是C
的习惯,在C99之前,您无法做到这一点。:)
由于C++
具有析构函数,因此在作用域退出时自动释放资源(文件、互斥等)也很方便,这可以使事情变得更清晰。这意味着,与在方法开始时获取共享资源相比,您可以在较短的持续时间内保留某些共享资源。
发布于 2012-03-14 22:40:53
一个可能的目的是control variable scope。由于具有自动存储的变量在超出作用域时会被销毁,因此这也可以使析构函数比其他情况下更早被调用。
发布于 2012-03-14 22:42:40
额外的大括号用于定义在大括号内声明的变量的作用域。这样做是为了在变量超出作用域时调用析构函数。在析构函数中,您可以释放互斥锁(或任何其他资源),以便其他资源可以获取它。
在我的产品代码中,我编写了类似这样的代码:
void f()
{
//some code - MULTIPLE threads can execute this code at the same time
{
scoped_lock lock(mutex); //critical section starts here
//critical section code
//EXACTLY ONE thread can execute this code at a time
} //mutex is automatically released here
//other code - MULTIPLE threads can execute this code at the same time
}
正如您所看到的,通过这种方式,您可以在函数中使用scoped_lock
,同时可以通过使用额外的大括号来定义其作用域。这确保了即使额外大括号外的代码可以由多个线程同时执行,大括号内的代码也将由一次只执行一个线程。
https://stackoverflow.com/questions/9704083
复制相似问题