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)
aga*_*zke 40
出于某种原因,我不会为此目的使用花括号.
如果你的特定功能足够大,你需要做各种范围的技巧,可能会将函数分解为更小的子函数.
引入用于范围重用变量名称的大括号只会导致代码中的混乱和麻烦.
只需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)
它可以成为代码生成器的福音.假设您有一个嵌入式SQL(ESQL)编译器; 它可能希望将SQL语句转换为需要局部变量的代码块.通过使用块,它可以反复使用固定变量名,而不必使用单独的名称创建所有变量.当然,这不是太难,但它比必要的更难.
正如其他人所说,由于功能强大的RAII(资源获取是初始化)习惯用法/模式,这在C++中相当普遍.
对于Java程序员(也许是C#,我不知道),这将是一个外国概念,因为基于堆的对象和GC杀死RAII.恕我直言,能够将对象放在堆栈上是C++相对于Java的最大单一优势,并使编写良好的C++代码比编写良好的Java代码更清晰.