當在C++頭文件中有一個靜態全局變量時,包含頭文件的每個翻譯單元都以其自己的變量副本結束。內聯成員函數使用的靜態全局變量
然而,如果我聲明在同一標題文件中的類,並創建一個類的成員函數,類聲明中的內聯實現,它使用靜態全局變量,例如:
#include <iostream>
static int n = 10;
class Foo {
public:
void print() { std::cout << n << std::endl; }
};
然後我看到下的gcc 4.4略微古怪的行爲:
如果我編譯不優化,成員函數的所有用途中使用該變量的副本從翻譯單元中的一個(上g ++命令提到的第一個線)。
如果我使用
-O2
進行編譯,每次使用成員函數都會使用來自作出該事件的翻譯單元的變量副本。
顯然這是非常糟糕的設計,所以這個問題只是出於好奇。但是,我的問題是,C++標準對這種情況說了些什麼? g ++是否通過在啓用和未啓用優化的情況下提供不同的行爲來正確行爲?
可能的重複:[h文件和內部鏈接中的靜態關鍵字](http://stackoverflow.com/questions/4276794/static-keyword-in-h-file-and-internal-linkage)。 – 2011-03-07 11:49:33