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.olibabc.a的可执行目标文件。

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

为什么ABC::val不是10?

我认为静态成员变量的范围是整个过程。

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

为什么?我认为test.olibabc.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.

以上是C++静态成员变量在单个进程中是否有不同的实例?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>