[英]c++ using static member as singleton instance leads to different object
[英]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.o和libabc.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.o和libabc.a的函數中獲得了 2 個不同的地址。
為什么? 我以為test.o和libabc.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.