栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ 实现不编译A.cpp就没有A模块

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ 实现不编译A.cpp就没有A模块

        非常规代码,有的时候,连接的时候,编译器认为没有使用A.cpp,结果导致编译了A.cpp也没有A模块,需要添加特殊的连接指令。只是好玩,慎用。

        实现思路。定义一个全局的管理Factory的类Factorys,在A.cpp里面定义一个全局变量,全局变量构造的时候,把 A 的 工厂类 FactoryA 插入到Factorys中。这样只要编译连接了A.cpp,就会在构造的时候把A模块插入到Factorys中了。

        原理很简单,实现又遇到一个问题:构造的顺序的问题,假如Factorys也是全局变量。此时FactoryA和Factorys的构造顺序不是固定的,可能先构造了FactoryA,而此时Factorys还没有初始化,导致出错。

        为此。我研究了c++的整个构造过程,发现,构造是单线程,此时main函数都没有开始执行。

如果是int 这样的基本类型,分配内存的时候,就已经初始化完了,在所有全局变量中,是最早初始化的。第二个全局类变量初始化,此时会调用构造函数。第三个,函数内static定义的变量。只在函数第一次进入的时候初始化。

        如果构造时,调用函数内static定义的变量,如下:

//Factorys.cpp
Factorys * Factorys::getInstance(){
    static Factorys fac;
    return &fac;
}


//A.cpp
FactoryA::FactoryA(){
    Factorys::getInstance()->insert(this);
}
static FactoryA gFacA;

        这样就能保证Factorys永远在FactoryA构造之前构造。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347437.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号