编程札记(二)

 

一、获取任意数据在编译器中的类型标识

  1.利用多态

  2.利用 dynamic_cast

  3.利用 typeid(推荐这种方法)

  对于多态实现,存在以下缺陷:

    1)必须从基类开始提供类型虚函数;

    2)所有的派生类都必须重写类型虚函数;

    3)每个派生类的类型名必须唯一;

  对于 dynamic_cast 实现,只能得到类型转换的结果,不能获取真正的动态类型,同时dynamic_cast 必须多态实现。

  typdeid 专门用于动态类型识别

  1. 它是一个关键字
  2. typeid返回一个type_info类对象
  3. 使用时需要包含头文件<typeinfo>
  4. 直接指定对象或者类型,普通类型普通对象也可以

  用法一:const char* typeid(数据).name();

  用法二: A* p;  if ( typeid(*p) == typeid(A) ) { … }

      

 

二、链接库

  •   A、动态链接库使用__declspec(dllexport)与__declspec(dllimport);

  静态链接库使用__declspec(dllexprot)与 extern

  网络相关资料:

    1. "extern" is for statically linked libraries?
    2. "__declspec(dllimport)" is for DLL (dynamically linked libraries)?
    3. both do actually the same job for their respective type of linking?
    4. 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编译的,包含上个静态库,链接通过。

 

posted @ 2022-02-22 10:17  IceArrow  阅读(23)  评论(0编辑  收藏  举报