C ++中不必要的花括号?
今天为同事做代码审查时,我看到了一件奇怪的事情。 他用这样的大括号包围了他的新代码:
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;
}
}
(不要介意代码,只要坚持花括号......))在花括号之后,有一些更多的细节,状态检查和基本信号。
我和那个人谈过,他的动机是限制变量的范围,命名冲突,以及其他一些我无法真正理解的东西。
从我的POV来看,这似乎很奇怪,我不认为花括号应该在我们的代码中。 我在所有答案中都看到了一些很好的例子,说明为什么可以用大括号括起代码,但是不应该将代码分离成方法吗?
有时候它很好,因为它给了你一个新的范围,你可以更“干净地”声明新的(自动)变量。
在C++
这可能不是那么重要,因为你可以在任何地方引入新的变量,但是习惯是从C
,在C99之前你不能这样做。 :)
由于C++
具有析构函数,因此在范围退出时自动释放资源(文件,互斥锁等)也很方便,这可以使事情更加简洁。 这意味着您可以在一段较短的持续时间内保留一些共享资源,而不是在方法开始时抓取它。
一个可能的目的是控制变量作用域。 由于具有自动存储的变量在超出范围时被销毁,这也可以使析构函数早于其他方式被调用。
额外的大括号用于定义大括号内声明的变量的范围。 这样做是为了在变量超出范围时调用析构函数。 在析构函数中,你可以释放一个互斥体(或任何其他资源),以便其他人可以获得它。
在我的生产代码中,我写了这样的内容:
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
,同时可以使用额外的大括号来定义它的作用域。 这可以确保即使额外花括号外的代码可以同时由多个线程执行,花括号内的代码也会一次只执行一个线程 。
上一篇: Unnecessary curly braces in C++?
下一篇: NetBeans, Turn off **ANY** auto indentation / auto formatting