你是否使用花括号进行额外的范围设计?

bli*_*sta 38 c++ java scope curly-braces

我的意思是除了在函数,类,if,while,switch,try-catch需要时使用它.

在我看到这个问题之前,我不知道可以这样做.

在上面的链接中,Eli提到"他们使用它来折叠代码的逻辑部分,这些逻辑部分不属于通常折叠起来的函数,类,循环等."

除了提到的那些之外还有什么其他用途?

使用花括号来限制变量的范围并仅在需要时扩展范围(在"需要访问"的基础上工作)是一个好主意吗?或者它真的很傻?

如何使用范围,以便您可以在不同的范围内使用相同的变量名称,但在相同的更大范围内?或者,重用相同的变量(如果你想使用相同的变量名)是更好的做法,并节省解除分配和分配(我想一些编译器可以对此进行优化?)?或者更好地使用不同的变量名称?

Ada*_*rce 50

如果我正在使用我想在特定时间释放的资源,我会这样做,例如:

void myfunction()
{
  {
  // Open serial port
     SerialPort port("COM1", 9600);
     port.doTransfer(data);
  } // Serial port gets closed here.

  for(int i = 0; i < data.size(); i++)
     doProcessData(data[i]);
  etc...
}
Run Code Online (Sandbox Code Playgroud)

  • SerialPort实现IDisposable.您应该使用`using`块来确保释放资源. (10认同)
  • 是的RAII是使用"匿名"范围而不是创建新函数的最佳理由,因为RAII变量的绑定范围通常非常小. (3认同)

aga*_*zke 40

出于某种原因,我不会为此目的使用花括号.

  1. 如果你的特定功能足够大,你需要做各种范围的技巧,可能会将函数分解为更小的子函数.

  2. 引入用于范围重用变量名称的大括号只会导致代码中的混乱和麻烦.

只需2美分,但我在其他最佳实践材料中看到了很多这类东西.


Mar*_*cin 16

我经常使用的范围最常见的"非标准"使用范围是使用范围的互斥锁.

void MyClass::Somefun()
{
    //do some stuff
    {
        // example imlementation that has a mutex passed into a lock object:
        scopedMutex lockObject(m_mutex); 

        // protected code here

    } // mutex is unlocked here
    // more code here
}
Run Code Online (Sandbox Code Playgroud)

这有许多好处,但最重要的是即使在受保护的代码中抛出异常,也会始终清除锁定.


Gre*_*ers 15

C++:

有时你需要引入一个额外的大括号范围,以便在有意义时重用变量名:

switch (x) {
    case 0:
        int i = 0;
        foo(i);
        break;
    case 1:
        int i = 1;
        bar(i);
        break;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不能编译.你需要做到:

switch (x) {
    case 0:
        {
            int i = 0;
            foo(i);
        }
        break;
    case 1:
        {
            int i = 1;
            bar(i);
        }
        break;
}
Run Code Online (Sandbox Code Playgroud)


Gra*_*row 11

正如其他人所说,最常见的用途是确保析构函数在您需要时运行.使特定于平台的代码更清晰一点也很方便:

#if defined( UNIX )
    if( some unix-specific condition )
#endif
    {
        // This code should always run on Windows but 
        // only if the above condition holds on unix
    }
Run Code Online (Sandbox Code Playgroud)

为Windows构建的代码不会看到if,只有大括号.这比以下更清楚:

#if defined( UNIX )
    if( some unix-specific condition ) {
#endif
        // This code should always run on Windows but 
        // only if the above condition holds on unix
#if defined( UNIX )
    }
#endif
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 6

它可以成为代码生成器的福音.假设您有一个嵌入式SQL(ESQL)编译器; 它可能希望将SQL语句转换为需要局部变量的代码块.通过使用块,它可以反复使用固定变量名,而不必使用单独的名称创建所有变量.当然,这不是太难,但它比必要的更难.


Dre*_*all 6

正如其他人所说,由于功能强大的RAII(资源获取是初始化)习惯用法/模式,这在C++中相当普遍.

对于Java程序员(也许是C#,我不知道),这将是一个外国概念,因为基于堆的对象和GC杀死RAII.恕我直言,能够将对象放在堆栈上是C++相对于Java的最大单一优势,并使编写良好的C++代码比编写良好的Java代码更清晰.


Jas*_*ers 5

我只在需要通过RAII释放某些内容时才使用它,即使只是在我尽可能早地释放它时(例如释放一个锁).