2013-01-01 32 views
1

可能重複:
Scope with Brackets in C++語句塊沒有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++中只有公平嗎?
+1

請參閱[在C++中使用括號的作用域](http://stackoverflow.com/questions/5072845/scope-with-brackets-in-c)。 – DCoder

+0

你沒有道理。以合理的方式改寫問題 – SomeWittyUsername

回答

4

就語言標準而言,整體結構(即未命名的塊)被稱爲複合語句。它有助於引入新的範圍。

在C++中,通常有兩種用途此:

  1. 爲了限制一個局部變量來的代碼的特定部分;目標是儘量減少「污染」的範圍,並使代碼讀者更容易。 (在C和Java等其他語言中也是如此)。

  2. 嚴格控制對象/資源的生命週期,因爲範圍局部變量的析構函數將在範圍的末尾自動調用。這可以用於幾個聰明的事情,例如自動關閉文件句柄,釋放互斥,等等。所以你可能會聽到人們談論如有限範圍的互斥體。 (C和Java沒有析構函數,所以這個概念不會被翻譯。)

+0

要回答第(3)部分:在C語言中也是合法的,但由於C99允許在任何地方使用變量聲明,因此沒有用處。在C++中,主要優點是作用於新塊的變量在塊的末尾調用它們的析構函數。這似乎是這裏的目的。 –

3

它沒有名字,它是一段代碼。大括號在Unlocker控制的鎖上放置了一個明確的生命週期。

這是C和C++中非常有效的技術。在C++中,使用RAII來限制對象的生命週期並及時釋放資源(比如鎖)的可能性更大一些,儘管在C中使變量的生命週期對讀者。

+0

註解:在C和C++中,作用域不僅控制生命週期,取決於生命週期,其內部聲明的(temp)變量的可見性僅限於其範圍。因此,在這樣的範圍內聲明的變量不能從封閉範圍訪問。但是一定要小心,因爲範圍中的聲明會從封閉範圍中映射具有相同名稱的標識符! – Sam