我正在尝试解决c ++中的一些问题,但我从未见过此表达式。由于我不知道该表达式叫什么,因此无法对其进行谷歌搜索。
int main() {
int something=1;
{
assert(something);
}
// What is the purpose of these braces?
// and what is it called?
{
assert(something != NULL);
}
return;
}
答案 0 :(得分:7)
使用大括号会创建一个新的block scope。
每次编写if (...) { ... }
或while (...) { ... }
时,{ ... }
部分是一个新作用域。在内部创建的所有具有自动存储期限的对象(通常的变量,但不是动态分配的对象,例如,通过new
分配的对象)将在到达作用域末尾时被销毁。如果您需要限制某个对象的生命周期,则不带任何if
,while
等的范围很有用。例如:
{
std::vector<float> some_data = get_the_data();
send_somewhere(some_data);
send_somewhere_else(some_data);
}
在这里,到达}
之后,some_data
对象将被销毁,其分配的内存将被释放,而您 不能 忘记了删除它,因为语言本身保证了删除。
另一个常见的例子是互斥锁:
// some preparation code
{
std::lock_guard<std::mutex> lock { my_lovely_mutex };
some_shared_resource.modify();
}
// something that does not need the mutex to be locked
在这里,即使lock_guard
抛出异常,modify()
也会在创建时锁定互斥锁,并在破坏时解锁。同样,您 不能 忘记解锁互斥锁(并且忘记这样做是非常危险的事情)。
话虽这么说,但我不知道将assert
放在单独的范围内的原因-适当的assert
(无论是函数还是宏)通常是一个独立的语句并且不需要这种黑客。
#define assert(x) bool b = (x); _internal_assert(b);
然后做
assert(x);
assert(y);
会触发编译错误,因为这会扩展为
bool b = (x); _internal_assert(b);
bool b = (y); _internal_assert(b);
其中变量b
被声明两次。
在自己的作用域中隐藏这样的assert
可以解决此问题,因为在不同作用域中声明的变量不会互相干扰:
{
bool b = (x); _internal_assert(b);
}
// ...
{
bool b = (y); _internal_assert(b);
}
答案 1 :(得分:0)
块效应作用域。 在您介绍的情况下,它们除了满足作者的风格外没有其他用途。