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

有人可以解释这里发生了什么吗?什么是链接器?同一个变量如何初始化两次?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ebs 供应商地点信息_供应商,地址,业务实体,地点关联银行账户

在此记录一下自己学习过程。新手,请多多指教,谢谢。最近客户有需求,找出供应商对应的银行信息,查看了下网上帖子,发现都是从供应商及供应商地点层发起,去查找对应的银行信息,但是,供…

c语言递归函数检测回文,递归法判断回文字符串,急用

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*--------用线性表存储字符串,结合堆栈判断回文(关键判断个数为奇或偶,奇跳过中间数据)---------*/#include #include #define ok 1;#define error 0;typedef char elemtype;typedef struct lnode{lnode *n…

python vector_50行Python代码实现经典游戏,不仅是划水神器,更是学习利器!

Free Python Games非常适合学生,它不仅具有高度的组织性和灵活性,而且能够激发人们探索和理解能力。--Terri FurtonFree Python Games在轻松的环境中把游戏和学习结合在一起,从而减轻了编程过程中的压力。--Brett Bymaster...贪吃蛇、迷宫、吃…

r roc函数_画ROC曲线的R包总结

原标题:画ROC曲线的R包总结作者: Joseph Rickert原文链接:https://rviews.rstudio.com/2019/03/01/some-r-packages-for-roc-curves/在这篇文章中,我将描述如何在CRAN中搜索绘制ROC曲线的包,并强调六个有用的包。虽然一…

c语言出圈游戏课设报告,c语言作业 出圈游戏

#include//头函数#include#include#define SIZE 100struct SeqList{int num;char name[10];};int menu_select();//函数声明部分void Joseph1();void Joseph2();void Joseph3();void Joseph4();void Joseph(struct SeqList *p,int length);void main() //主要程序段{printf(&qu…

laravel框架中文手册_node.js 后端框架star 排名 2020年11月更新,fastify 超 egg

发布时间以首个版本发布(0.x)为准。第一名: express 50.8k (2010年1月发布) 目前star 和下载量最高的老牌框架。https://github.com/expressjs/express​github.com第二名:meteor 42.1k (2012年…

c语言~991|4等于多少,复习C语言9-helloworld3000-ChinaUnix博客

关于位操作1. 不使用中间变量,交换a、b的值。如使用:a a b; b a - b; a a - b;则当a、b都比较大时,ab的值可能会溢出。而采用下述方法则没有溢出越界的问题:a a ^ b;b a ^ b;a a ^ b;证明其实很简单,只要熟悉二…

python音乐下载器交互界面_基于Python实现下载网易音乐代码实例

代码如下 # 爬取网易音乐 import requests from bs4 import BeautifulSoup import urllib.request headers {"origin": "https://music.163.com", "referer": "https://music.163.com/", "user-agent": "Mozilla/5.0 …

2020年度工作计划_2020最新年度个人工作计划(精选3篇)

时间稍纵即逝,前方等待着我们的是新的机遇和挑战,不妨坐下来好好写写工作计划吧。工作计划怎么写才能发挥它最大的作用呢?下面是小编为大家整理的2020最新年度个人工作计划(精选3篇),希望能够帮助到大家。年度个人工作计划1转眼间…

c语言中把各位上为奇数的数取出,下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲。 - 赏学吧...

下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲。高位仍在高位,低位仍在低位。例如当s中的数为87653142时,t中的数为7531。请改正函数fun()中的错误,使它能得出正确的结…

java 格式化字符串_Java入门 - 语言基础 - 14.String类

1.概述字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。2.创建字符串创建字符串最简单的方式如下:String greeting "光束云";在代码中遇到字符串常量时,这里的值是 "光束…

c语言按照姓名查询员工信息,输入10个职工信息,按号码大小排序,再使用查找函数找职工的姓…...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include //主函数int main(){int sort(int num[10],char name[10][10],int n);int survey(int num[10]);int num[10];int n10;char name[10][10];int i;for(i0;i<9;i){printf("请输入第%d个职工的工号\n",i1…

decimal是什么类型_SQLMysql数据类型

一 前言每个数据库的数据类型从来都不是一个简单的数据结构&#xff0c;特别是使用不同的数据库&#xff0c;不同的引擎&#xff0c;其支持的数据类型也不一样&#xff0c;选择那种数据类型作为字段类型对数据库的性能也是天差地别&#xff0c;故对数据类型有个全面的认知&…

python 栈和队列_python 栈和队列的基本实现

python中的列表结构可以用来实现栈和队列。 【栈】&#xff1a; 栈是一种数据结构&#xff0c;具有先入后出的特点&#xff0c;并且栈的所有操作只能在某一端进行&#xff0c;能进行操作的一端的第一个元素称为栈顶&#xff0c;另一端的第一个元素称为栈底 栈的五种基本方法&am…

e480win7显卡驱动_e480安装了windows7显卡驱动装不上

展开全部一、显卡驱动程序启用驱动程序签名功能启用驱动程序签名功能是成功安装显卡驱动的第e68a84e8a2ad3231313335323631343130323136353331333433663031一步&#xff0c;因为只有启动了驱动程序签名&#xff0c;才能阻止系统的自动安装驱动程序功能&#xff0c;才可以抢在系…

android oat如何提取dex文件字节码,Android: 使用oatdump反编译oat文件

网上经常看到有通过apktool将apk中的dex反编译成smali格式的文件&#xff0c;以便分析功能实现与破—解&#xff0c;确没怎么看到oat文件反通过oatdump反编译的&#xff0c;所以就写了一篇这样的文档。声明一下oat文件也是可以反编译的。本来想着通过oatdump处理之后&#xff0…

mybatis依赖_Spring Boot2 系列教程(二十一)整合 MyBatis

前面两篇文章和读者聊了 Spring Boot 中最简单的数据持久化方案 JdbcTemplate&#xff0c;JdbcTemplate 虽然简单&#xff0c;但是用的并不多&#xff0c;因为它没有 MyBatis 方便&#xff0c;在 SpringSpringMVC 中整合 MyBatis 步骤还是有点复杂的&#xff0c;要配置多个 Bea…

android获取图片格式,Android得到图片的真实格式——从本地文件或者网络文件流...

ImageFormatFeatures支持从InputStream或者File解析四种格式&#xff1a;jpg 、 png 、 webp 、 gif从文件本身解析格式&#xff0c;而不是从扩展名获取FormatHelper.getFormat(InputStream inputStream)FormatHelper.getFormat(File file)UsageStep 1Step 2解析格式String For…

python中setup函数的用法_python学习之setUp函数和tearDown函数

1,setUp():就是在一个类中最先被调用的函数,每次执行一个函数都要先执行这个函数,有几个函数就被调用几次,与放的位置无关,随便放到哪里都会先执行这个函数 2,tearDown():就是在一个类中最后被调用的函数,每个函数执行之后都会执行一次,与放的位置无关,随便放到哪里…

pagehelper的使用_SpringBoot项目中,如何更规范的使用PageHelper分页?

SpringBoot项目中&#xff0c;如何更规范的使用PageHelper分页&#xff0c;拉勾IT课小编为大家分解一. 开发准备1. 开发工具• IntelliJ IDEA 2020.2.32. 开发环境• Red Hat Open JDK 8u256• Apache Maven 3.6.33. 开发依赖SpringBoot<dependency><groupId>org.s…