当在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