日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言 静态变量 初始化,c – 静态变量初始化两次

發布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 – 静态变量初始化两次的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。