gpt4 book ai didi

c++ - C++ 静态成员变量在单个进程中是否具有不同的实例?

转载 作者:行者123 更新时间:2023-12-04 02:25:47 25 4
gpt4 key购买 nike

让我们考虑一个具有一个静态成员变量和两个静态方法的 C++ 类:

ABC.h

class ABC
{
private:
static int val;

public:
static void set_val(int v);
static int get_val();
};

ABC.cpp

    int ABC::val = 0;

void ABC::set_val(int v) {
val = v;
}

int ABC::get_val() {
return val;
}

类在静态库中定义和实现:libabc.a

我制作了一个链接test.olibabc.a 的可执行目标文件。

我的问题是,当我在 test.o 中调用 ABC::set_val(10) 并调用另一个函数时,abc_func() , 在libabc.a;
abc_func() 调用了 ABC::get_val() 并得到了一个 0。

为什么 ABC::val 不是 10?

我以为一个静态成员变量的作用域就是整个过程。

我打印了 ABC::val 的地址,并在属于 test.olibabc.a 的函数中得到了 2 个不同的地址.

为什么?我以为test.olibabc.a在同一个进程,所以静态成员变量地址应该是一样的。

谁能解释一下?

最佳答案

您违反了 One Definition Rule ,由非标准编译器教唆。在 C++17 之前你不能有 definition类定义中的静态数据成员,在 C++17 之后,您必须使用 inline 说明符定义它。

违反 ODR 意味着您的程序格式错误,不需要诊断。 IE。编译器和链接器不需要为你的程序发出错误,C++ 的规则说它可以有任何意义。看起来您的实现选择了表现得好像有两个单独的 ABC::val 对象。

关于c++ - C++ 静态成员变量在单个进程中是否具有不同的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67824342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com