c语言 静态变量 初始化,c – 静态变量初始化两次
考慮到我在編譯單元中有一個靜態變量,最后在靜態庫libA中.然后我有另一個編譯單元訪問這個變量,最終在一個共享庫libB.so(所以libA必須鏈接到libB).最后,我有一個主要功能也直接從A訪問靜態變量,并具有對libB的依賴(所以我鏈接到libA和libB).
我然后觀察,靜態變量被初始化了兩次,即它的構造函數運行兩次!這似乎不對.鏈接器不應該識別兩個變量是否相同,并將它們優化為一個?
為了使我的困惑完美,我看到它運行兩次與同一個地址!那么也許連接器確實識別了它,但是沒有刪除static_initialization_and_destruction代碼中的第二個調用?
這是一個展示:
ClassA.hpp:
#ifndef CLASSA_HPP
#define CLASSA_HPP
class ClassA
{
public:
ClassA();
~ClassA();
static ClassA staticA;
void test();
};
#endif // CLASSA_HPP
ClassA.cpp:
#include
#include "ClassA.hpp"
ClassA ClassA::staticA;
ClassA::ClassA()
{
printf("ClassA::ClassA() this=%p\n",this);
}
ClassA::~ClassA()
{
printf("ClassA::~ClassA() this=%p\n",this);
}
void ClassA::test()
{
printf("ClassA::test() this=%p\n",this);
}
ClassB.hpp:
#ifndef CLASSB_HPP
#define CLASSB_HPP
class ClassB
{
public:
ClassB();
~ClassB();
void test();
};
#endif // CLASSB_HPP
ClassB.cpp:
#include
#include "ClassA.hpp"
#include "ClassB.hpp"
ClassB::ClassB()
{
printf("ClassB::ClassB() this=%p\n",this);
}
ClassB::~ClassB()
{
printf("ClassB::~ClassB() this=%p\n",this);
}
void ClassB::test()
{
printf("ClassB::test() this=%p\n",this);
printf("ClassB::test: call staticA.test()\n");
ClassA::staticA.test();
}
TEST.CPP:
#include
#include "ClassA.hpp"
#include "ClassB.hpp"
int main(int argc,char * argv[])
{
printf("main()\n");
ClassA::staticA.test();
ClassB b;
b.test();
printf("main: END\n");
return 0;
}
然后我編譯并鏈接如下:
g++ -c ClassA.cpp
ar rvs libA.a ClassA.o
g++ -c ClassB.cpp
g++ -shared -o libB.so ClassB.o libA.a
g++ -c Test.cpp
g++ -o test Test.cpp libA.a libB.so
輸出為:
ClassA::ClassA() this=0x804a040
ClassA::ClassA() this=0x804a040
main()
ClassA::test() this=0x804a040
ClassB::ClassB() this=0xbfcb064f
ClassB::test() this=0xbfcb064f
ClassB::test: call staticA.test()
ClassA::test() this=0x804a040
main: END
ClassB::~ClassB() this=0xbfcb064f
ClassA::~ClassA() this=0x804a040
ClassA::~ClassA() this=0x804a040
有人可以解釋這里發生了什么嗎?什么是鏈接器?同一個變量如何初始化兩次?
總結
以上是生活随笔為你收集整理的c语言 静态变量 初始化,c – 静态变量初始化两次的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js cookie 存储checkbox
- 下一篇: B+树操作方式