今天给同事复查代码时,我发现了一件奇怪的事情。他把他的新代码用大括号括起来,就像这样:

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

(不要介意代码,只要坚持花括号…,)) 在花括号之后,还有更多的位处理、状态检查和基本信号。

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

从我的角度来看,这似乎很奇怪,我认为花括号不应该出现在我们的代码中。在所有关于为什么可以用花括号包围代码的回答中,我看到了一些很好的例子,但你不应该把代码分成方法吗?

fsdf

当前回答

在多线程编程中将作用域锁与临界区结合使用时,这非常有用。在花括号中初始化的作用域锁(通常是第一个命令)将在块的末尾超出作用域,因此其他线程将能够再次运行。

其他回答

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

在编辑中查看代码后,我可以说不必要的括号可能(在原始编码器的视图中)100%清楚在if/then期间会发生什么,即使现在只有一行,以后可能会有更多行,括号保证你不会犯错误。

{
   bool isInit;
   (void)isStillInInitMode(&isInit);
   if (isInit) {
     return isInit;
   }
   return -1;
}

如果以上是原来的,删除“extras”将导致:

{
   bool isInit;
   (void)isStillInInitMode(&isInit);
   if (isInit) 
     return isInit;
   return -1;
}

然后,稍后的修改可能是这样的:

{
   bool isInit;
   (void)isStillInInitMode(&isInit);
   if (isInit) 
     CallSomethingNewHere();
     return isInit;
   return -1;
}

当然,这会导致一个问题,因为现在isInit总是会被返回,不管if/then。

在多线程编程中将作用域锁与临界区结合使用时,这非常有用。在花括号中初始化的作用域锁(通常是第一个命令)将在块的末尾超出作用域,因此其他线程将能够再次运行。

一个原因可能是在新花括号块中声明的任何变量的生命周期都限制在这个块中。我想到的另一个原因是能够在最喜欢的编辑器中使用代码折叠。

当物体超出范围时,它们会自动被魔法摧毁。