永发信息网

C++类库是根据什么生成DLL的? 命名空间吗?

答案:3  悬赏:80  手机版
解决时间 2021-04-06 01:09
  • 提问者网友:饥饿走向夜
  • 2021-04-05 04:27
C++类库是根据什么生成DLL的? 命名空间吗?
最佳答案
  • 五星知识达人网友:不如潦草
  • 2021-04-05 04:47

  基本上回答是调不了,原因来自引用名和调用约定两方面。这个需要从VC++导出类的原理说起。
  类从本质上来说是数据结构和封装的操作两部分。数据结构定义在头文件当中,编译的时候就可以访问到;而成员函数是从DLL中导出的。导出C++类库的时候,这些函数名字会按照编译器的标准做一个扩展,比如说
  class B{
  int Operator(int a, int b);
  };
  里面的Operator这个成员函数,实际上会被编译成类似于这样的一个函数:
  int __thiscall B_Operatorxxxxxx(B* _this, int a, int b);
  (__thiscall这个关键字其实是C++里没有的)

  注意到名字后面增加了一些像乱码一样的东西,这是C++编译器根据后面的参数列表自动生成的一个后缀。因为这个后缀的存在,相同名字不同参数的函数和成员函数才可以一起存在在代码里(即所谓的重载)。

  这也就是说,想要调用C++类库里的函数的话,至少要知道编译器把这个函数编译成了什么名字,但实际上不同的编译器编译出来的结果都不一样。

  其实这也算不上什么问题,编译的时候如果设置输出详细信息的话是有办法能查到实际编译成什么名字了的。更严重的问题来自调用约定:
  正如上文中提到的,C++的成员函数采用__thiscall的调用约定。所谓调用约定,是指在调用函数时如何传递参数,用什么顺序传递参数,以及由谁来负责清理堆栈的约定。__thiscall这个调用约定是不被托管程序的[DllImport]属性支持的。

  当然不排除一些拐弯抹角的方法是能调用的。即便如此也是极其不推荐的做法。
  鍙傝 冭祫鏂欙细五湖四海皆春色 万水千山尽得辉 万象更新
全部回答
  • 1楼网友:廢物販賣機
  • 2021-04-05 05:16
C++类库是根据什么生成DLL的? 命名空间吗?
春花含笑意 爆竹增欢声喜气盈门 喜居宝地千年旺 福照家门万事兴 喜迎新春
  • 2楼网友:冷風如刀
  • 2021-04-05 04:53
默认是项目名称。
自己也可以调的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯