【问题标题】:Statement blocks without a keyword in C++ [duplicate]C ++中没有关键字的语句块[重复]
【发布时间】:2013-01-01 15:25:19
【问题描述】:

可能重复:
Scope with Brackets in C++

我正在处理 v8 javascript 引擎,为我大学的新生开发学习环境,我正在努力:

d8.cc:309

char* input = NULL;
{  // Release lock for blocking input.
  Unlocker unlock(isolate);
  input = fgets(buffer, kBufferSize, stdin);
}
  1. 它叫什么名字?
  2. 如何在其他情况下使用它?
  3. 只有在 c++ 中才公平吗?

【问题讨论】:

标签: c++


【解决方案1】:

就语言标准而言,整体结构(即未命名的块)称为复合语句。它用于引入一个新的范围。

在 C++ 中,这通常有两种用途:

  1. 将局部变量限制为特定的代码段;目的是尽量减少范围“污染”,并使代码读者更容易。 (同样可以用其他语言实现,例如 C 和 Java。)

  2. 严格控制对象/资源的生命周期,因为作用域局部变量的析构函数将在作用域结束时自动调用。这可以用于一些聪明的事情,例如自动关闭文件句柄、释放互斥锁等。所以你可能会听到人们谈论例如作用域互斥体。 (C 和 Java 没有析构函数,所以这个概念不能翻译。)

【讨论】:

  • 回答第 (3) 部分:它在 C 中也是合法的,但没有那么有用,因为 C99 允许在任何地方声明变量。在 C++ 中,主要优点是作用域为新块的变量在块的末尾调用其析构函数。这似乎是这里的目的。
【解决方案2】:

它没有名字,它是一段代码。大括号为 Unlocker 控制的锁设置了明确的生命周期。

这是在 C 和 C++ 中完全有效的技术。在 C++ 中更有可能看到它,其中 RAII 用于限制对象的生命周期并提供及时的资源释放(例如锁),尽管在 C 中使变量的生命周期清晰可见是非常有用的阅读器。

【讨论】:

  • 注解:在 C 和 C++ 中,作用域不仅仅控制生命周期,根据生命周期,内部声明的 (temp) 变量的可见性仅限于它们的作用域。因此,在这种范围内声明的变量不能从包含范围内访问。但必须小心,因为在作用域中的声明会遮蔽与封闭作用域具有相同名称的标识符!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2017-09-17
相关资源
最近更新 更多