首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++中不必要的大括号?

C++中不必要的大括号?
EN

Stack Overflow用户
提问于 2012-03-14 22:39:28
回答 14查看 42.2K关注 0票数 199

今天在为一位同事做代码审查时,我看到了一件奇怪的事情。他用大括号括起了他的新代码,如下所示:

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;
   }
}

(不要介意代码,只需使用大括号...;) )在花括号之后,还有一些位旋转、状态检查和基本信令。

我和他谈过,他的动机是限制变量的范围,命名冲突,以及其他一些我不能真正了解的东西。

从我的观点来看,这似乎相当奇怪,我认为花括号不应该出现在我们的代码中。我在所有的答案中看到了一些很好的例子,解释了为什么可以用大括号括起代码,但你不应该把代码分成几个方法吗?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2012-03-14 22:41:54

它有时很好,因为它给了你一个新的作用域,在那里你可以更“干净”地声明新的(自动)变量。

C++中,这一点可能并不那么重要,因为您可以在任何地方引入新变量,但这可能是C的习惯,在C99之前,您无法做到这一点。:)

由于C++具有析构函数,因此在作用域退出时自动释放资源(文件、互斥等)也很方便,这可以使事情变得更清晰。这意味着,与在方法开始时获取共享资源相比,您可以在较短的持续时间内保留某些共享资源。

票数 302
EN

Stack Overflow用户

发布于 2012-03-14 22:40:53

一个可能的目的是control variable scope。由于具有自动存储的变量在超出作用域时会被销毁,因此这也可以使析构函数比其他情况下更早被调用。

票数 173
EN

Stack Overflow用户

发布于 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,同时可以通过使用额外的大括号来定义其作用域。这确保了即使额外大括号外的代码可以由多个线程同时执行,大括号内的代码也将由一次只执行一个线程

票数 102
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9704083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档