簡體   English   中英

C++ static 成員變量在單個進程中是否具有不同的實例?

[英]Does C++ static member variable has different instance in a single process?

讓我們考慮一個 C++ class 與一個 static 成員變量和兩個 ZA81259CEF8E959C3624DF1D457E 方法:

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;
    }

Class 在 static 庫中定義和實現: libabc.a

我制作了一個鏈接test.olibabc.a的可執行 object 文件。

我的問題是,當我在test.o中調用ABC::set_val(10)並在 libabc.a 中調用另一個 function、 abc_func abc_func()時;
abc_func()調用ABC::get_val()並得到一個 0。

為什么ABC::val不是 10?

我以為 static 成員變量的 scope 是整個過程。

我打印了ABC::val的地址,並在屬於test.olibabc.a的函數中獲得了 2 個不同的地址。

為什么? 我以為test.olibabc.a在同一個進程中,因此 static 成員變量地址應該相同。

誰能解釋一下?

您違反了由非標准編譯器慫恿的單一定義規則 Before C++17 you can't have an definition of your static data member within the class definition, and after C++17 you have to define it with the inline specifier.

違反 ODR 意味着您的程序格式錯誤,無需診斷。 即編譯器和 linker 不需要為您的程序發出錯誤,並且 C++ 的規則說它可以具有任何含義。 看起來您的實現選擇表現得好像有兩個單獨的ABC::val對象。

我找到了根本原因...我的 makefile 很復雜,libabc.a 已鏈接兩次...修復后,ABC::val 只有單個實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM