2012-12-27 128 views
4

如果我有一個靜態全局函數(不是類的靜態,全局靜態)中靜態局部變量...靜態全局函數的靜態本地成員?

Foo.cpp中:

static void f() 
{ 
    static T x; 
    ... 
} 

是保證整個是單身的X實例應用?

如果兩個翻譯單元如上定義static void f()會怎麼樣。他們每個人都有自己的x實例,還是會共享?爲什麼?

回答

4

static函數具有內部聯動,所以在每個轉換單元的每個f將是一個不同的獨立功能,並且會有的x實例每翻譯單元。

2

確保x實例在整個應用程序中是單例嗎?

確保在第一次創建f()時被調用。這是一個static storage duration object,這意味着它將被其他static storage duration object銷燬(按照創建的相反順序)。

此變量x只在函數f()內部可見。

如果兩個翻譯單元定義瞭如上所述的靜態void f()會怎麼樣。他們每個人都有自己的x實例,還是會共享?爲什麼?

由於這是一個靜態函數。翻譯單位在當地。每個定義該函數的翻譯單元都有自己的函數和其內部變量的副本。這不會暴露在翻譯單元之外,因此它只能來自翻譯單元。