C++静态成员变量在单个进程中是否有不同的实例?
让我们考虑一个带有一个静态成员变量和两个静态方法的 C++ 类,例如:
ABC.h
class ABC
{
private:
static int val;
public:
static void set_val(int v);
static int get_val();
};
ABC文件
int ABC::val = 0;
void ABC::set_val(int v) {
val = v;
}
int ABC::get_val() {
return val;
}
该类是在一个静态库中定义和实现的:libabc.a。
我制作了一个链接test.o和libabc.a的可执行目标文件。
我的问题是,当我ABC::set_val(10)在test.o 中调用并abc_func()在libabc.a 中调用另一个函数时;
abc_func()打ABC::get_val()了电话,结果是 0。
为什么ABC::val不是10?
我认为静态成员变量的范围是整个过程。
我ABC::val在属于test.o和libabc.a的函数中打印了 的地址并得到了 2 个不同的地址。
为什么?我认为test.o和libabc.a在同一个进程中,因此静态成员变量地址应该是相同的。
谁能解释一下?
回答
您违反了非标准编译器教唆的单一定义规则。C ++ 17之前,你不能有一个定义的类定义中的静态数据成员的,和C ++ 17后,你必须与定义它inline符。
违反 ODR 意味着您的程序格式错误,无需诊断。即编译器和链接器不需要为您的程序发出错误,并且 C++ 的规则说它可以有任何意义。看起来您的实现选择表现得好像有两个单独的ABC::val对象。
- @wiki Why don't you make changes to get the code to the point where you think it is required by the standard to work but doesn't and post it as a new question.