调用2个lib库,如果里面有同名类,会有冲突吗?

96掌门师兄 2013-06-27 02:23:45
比如我的exe,使用了静态库A和A1,里面都有类MyClass,那么在运行的时候会有冲突吗? 2个库中的MyClass成员函数是共用一份内存吗?
如果库A和A1同时又都使用了库B,B里面有静态成员变量static int age;那么在exe运行后,2个库里面的age是一份内存吗? 那且不是很危险? 如果A对age修改了,且不是会影响A1中的age值?

同样的,再问一下,如果B中有一个单例模式类
class TMainCtrl
{
private:
TMainCtrl(){};
static TMainCtrl *m_pMainCtrl;
public:
static TMainCtrl *GetInstance();
static void Destory();

};

TMainCtrl *TMainCtrl::m_pMainCtrl = new TMainCtrl();
那么A使用了静态库B,A1也使用了静态库B,最后exe使用A和A1,那么在exe中有几份MainCtrl()类代码? 类的静态成员变量是一个值吗?
...全文
1327 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2013-06-28
  • 打赏
  • 举报
回复
来学习学习。。
  • 打赏
  • 举报
回复
想想 静态链接 C/C++ 运行库的情况 静态库和exe都使用 静态链接运行库,都不会有冲突。链接器将相同的符号只保留一份。
lgstudyvc 2013-06-27
  • 打赏
  • 举报
回复
挺绕口的 static 声明的变量在C语言中有两方面的特征:   1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。   2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 Tips:   A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;   B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;   C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数) E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。 函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。 全局变量、静态全局变量、静态局部变量和局部变量的区别 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。   从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。   static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件   static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;   static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝 全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
victor_woo 2013-06-27
  • 打赏
  • 举报
回复
引用 11 楼 lostying 的回复:
上面打错了,应该是link xx.o yy.o
.o qt+gcc的? mfc没有o文件
victor_woo 2013-06-27
  • 打赏
  • 举报
回复
引用 9 楼 xiaoxiaoyu85 的回复:
[quote=引用 5 楼 victor_woo 的回复:] 只有1份核心对象
恩恩,真是好人啊,辛苦了。[/quote] 其实我是因为没有用过MFC的静态链接库,用了一下,挺简单的, 但还是会继续用动态链接库来做模块容器
无言猪 2013-06-27
  • 打赏
  • 举报
回复
上面打错了,应该是link xx.o yy.o
无言猪 2013-06-27
  • 打赏
  • 举报
回复
这个可以看有关链接器对符号的处理的资料,对于静态库,链接器会有一个引用但未定义的符号表,然后在进行lib链接时去查找,找到即结束这个符号的查找.也就是如果是link xx.cpp, yy.cpp, A.lib,A1.lib,那就是A.lib中的生效,如果是A1.lib,A.lib,就是A1.lib中的生效.包括static int age这一类只要找个一个定义就行了,如果多于一个linker会报错的,也就是内存中也只会有一份.
96掌门师兄 2013-06-27
  • 打赏
  • 举报
回复
引用 5 楼 victor_woo 的回复:
只有1份核心对象
恩恩,真是好人啊,辛苦了。
Eleven 2013-06-27
  • 打赏
  • 举报
回复
用命名空间吧~
oyljerry 2013-06-27
  • 打赏
  • 举报
回复
这就是为什么静态库最好有namespace的原因,不然容易搞乱
victor_woo 2013-06-27
  • 打赏
  • 举报
回复
另外:如果A和A1中有同名类, 在exe编译后 其中一个会被屏蔽掉(Debug跟踪)
victor_woo 2013-06-27
  • 打赏
  • 举报
回复


只有1份核心对象
96掌门师兄 2013-06-27
  • 打赏
  • 举报
回复
顶起来。。。。。
96掌门师兄 2013-06-27
  • 打赏
  • 举报
回复
引用 2 楼 ouyh12345 的回复:
pragma once保证了在使用A和B时,工程里只有一份MyClass 静态成员变量static int age;那么在exe运行后,2个库里面的age是一份内存吗? 当然是用一个 static就是干这个的
那么在lib库中使用单例模式且不是很危险?如果age不是静态变量,而是全局变量呢? 会是一份代码吗? 如果不是,编译的时候是怎么区分的?
ouyh12345 2013-06-27
  • 打赏
  • 举报
回复
pragma once保证了在使用A和B时,工程里只有一份MyClass 静态成员变量static int age;那么在exe运行后,2个库里面的age是一份内存吗? 当然是用一个 static就是干这个的
lgstudyvc 2013-06-27
  • 打赏
  • 举报
回复
静态,貌似楼主多疑是对的 2楼的,你认为呢?

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧