编程札记(二)
一、获取任意数据在编译器中的类型标识
1.利用多态
2.利用 dynamic_cast
3.利用 typeid(推荐这种方法)
对于多态实现,存在以下缺陷:
1)必须从基类开始提供类型虚函数;
2)所有的派生类都必须重写类型虚函数;
3)每个派生类的类型名必须唯一;
对于 dynamic_cast 实现,只能得到类型转换的结果,不能获取真正的动态类型,同时dynamic_cast 必须多态实现。
typdeid 专门用于动态类型识别
- 它是一个关键字
- typeid返回一个type_info类对象
- 使用时需要包含头文件<typeinfo>
- 直接指定对象或者类型,普通类型普通对象也可以
用法一:const char* typeid(数据).name();
用法二: A* p; if ( typeid(*p) == typeid(A) ) { … }
二、链接库
- A、动态链接库使用__declspec(dllexport)与__declspec(dllimport);
静态链接库使用__declspec(dllexprot)与 extern
网络相关资料:
- "extern" is for statically linked libraries?
- "__declspec(dllimport)" is for DLL (dynamically linked libraries)?
- both do actually the same job for their respective type of linking?
- you need to use both when you use import libraries (small .lib files that help linking with dll)?
- B、制作静态库时,使用了其它静态库,同时选定了MD或者MT,仍然报编译与其它库版本不同的错误,重新编译其它库之后问题没有消除。这时懵逼了,因为以前碰到过类似问题这样处理就OK了,这次却没有。检查是否是链接了其它地方的静态,其它库目录下并没有相关库,-_-" 最后随手点了编译错误窗口中VS给的错误链接,显示可能是部分库使用了 /GL(全程序优化)命令等。果然,去掉后编译通过。
- C、exe中使用制作好的这个静态库,总报该静态库使用的另一静态库中的方法没有定义。我了个FK,讲道理,定义应该被这个静态库包含在内了呀?看了一下都是MD编译的,包含上个静态库,链接通过。