{}在这些c ++函数中是什么意思?

时间:2018-06-21 22:14:45

标签: c++

我正在尝试解决c ++中的一些问题,但我从未见过此表达式。由于我不知道该表达式叫什么,因此无法对其进行谷歌搜索。

int main() {
   int something=1;

   {
     assert(something);
   }

   // What is the purpose of these braces?
   // and what is it called?
   {
     assert(something != NULL);
   }

   return;
}

2 个答案:

答案 0 :(得分:7)

使用大括号会创建一个新的block scope

每次编写if (...) { ... }while (...) { ... }时,{ ... }部分是一个新作用域。在内部创建的所有具有自动存储期限的对象(通常的变量,但不是动态分配的对象,例如,通过new分配的对象)将在到达作用域末尾时被销毁。如果您需要限制某个对象的生命周期,则不带任何ifwhile等的范围很有用。例如:

{
    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(无论是函数还是宏)通常是一个独立的语句并且不需要这种黑客。

正如雷米·勒博(Remy Lebeau)所指出的那样,作者使用的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)

  • {表示块的开始
  • }表示块的结尾

块效应作用域。 在您介绍的情况下,它们除了满足作者的风格外没有其他用途。