论坛首页 编程语言技术论坛

对细节的把握

浏览 6192 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-26  
是 thunk 不是 thrunk 吧 ... ?

这类宏不就是为了在用的地方和定义的地方用同一个标识符, 减少词汇污染么 ...
0 请登录后投票
   发表时间:2011-07-26  
ray_linn 写道
piao_bo_yi 写道
  今天公司来的新员工问我一段代码的含义
#ifdef BRIDGE3DWRAPPER
#define MB_BRIDGE3DWRAPPER_EXT __declspec(dllexport)
#else
#define MB_BRIDGE3DWRAPPER_EXT __declspec(dllimport)
#endif

  看起来似乎很简单,以前我也没考虑过这个问题,只是大概的了解__declspec(dllexport)是导出给别的dll使用的意思。但是本着对新人负责的态度,也不能这么给别人解释,所以我就问了一下大家这句话到底啥意思,问了一下,好多人说是导入导出的意思,import,export的中文解释?汗。。。查了一下,才知道原来的确想错了,大家知道这个是什么含义吗?看解释之前请自己想一想。
容易出错的地方:
1.__declspec(dllexport)保留函数相对地址和dll的地址以生成正确的函数调用。
2.__declspec(dllimport)保留函数地址计算后的绝对地址。所以明显比上面的要生成更快的代码。而且两个都从逻辑上表示导出的含义
3.由于产生时间的先后顺序,就有了上面的宏的结构来保证兼容性和利用新的特性(这个是推测的)。
看起来简单的地方还是很容易想当然的。

大家都想对了吗?




你从哪里找来的解释?为什么和MSDN完全不一样?

The dllexport and dllimport storage-class attributes are Microsoft-specific extensions to the C and C++ languages. They enable you to export and import functions, data, and objects to and from a DLL.

基本上你对细节的把握已经错到姥姥家去了。

dllexport是用来取代def文件,dllimport是为了避免调用其他dll中的函数产生跳转:因为是当exe加载一个dll到进程中时,如果没有dllimport,会产生一个跳转

jmp DWORD PTR __imp_func1, Microsoft称为thrunk,thrunk让代码变大且影响效率。如果有dllimport,则link产生的是indirect call :call DWORD PTR __imp_func1


我俩意思不一样吗?一个是需要计算的函数地址,一个是直接的函数地址。当时我也是在MSDN上找到的。
0 请登录后投票
   发表时间:2011-07-26   最后修改:2011-07-26
piao_bo_yi 写道
ray_linn 写道
piao_bo_yi 写道
  今天公司来的新员工问我一段代码的含义
#ifdef BRIDGE3DWRAPPER
#define MB_BRIDGE3DWRAPPER_EXT __declspec(dllexport)
#else
#define MB_BRIDGE3DWRAPPER_EXT __declspec(dllimport)
#endif

  看起来似乎很简单,以前我也没考虑过这个问题,只是大概的了解__declspec(dllexport)是导出给别的dll使用的意思。但是本着对新人负责的态度,也不能这么给别人解释,所以我就问了一下大家这句话到底啥意思,问了一下,好多人说是导入导出的意思,import,export的中文解释?汗。。。查了一下,才知道原来的确想错了,大家知道这个是什么含义吗?看解释之前请自己想一想。
容易出错的地方:
1.__declspec(dllexport)保留函数相对地址和dll的地址以生成正确的函数调用。
2.__declspec(dllimport)保留函数地址计算后的绝对地址。所以明显比上面的要生成更快的代码。而且两个都从逻辑上表示导出的含义
3.由于产生时间的先后顺序,就有了上面的宏的结构来保证兼容性和利用新的特性(这个是推测的)。
看起来简单的地方还是很容易想当然的。

大家都想对了吗?




你从哪里找来的解释?为什么和MSDN完全不一样?

The dllexport and dllimport storage-class attributes are Microsoft-specific extensions to the C and C++ languages. They enable you to export and import functions, data, and objects to and from a DLL.

基本上你对细节的把握已经错到姥姥家去了。

dllexport是用来取代def文件,dllimport是为了避免调用其他dll中的函数产生跳转:因为是当exe加载一个dll到进程中时,如果没有dllimport,会产生一个跳转

jmp DWORD PTR __imp_func1, Microsoft称为thrunk,thrunk让代码变大且影响效率。如果有dllimport,则link产生的是indirect call :call DWORD PTR __imp_func1


我俩意思不一样吗?一个是需要计算的函数地址,一个是直接的函数地址。当时我也是在MSDN上找到的。



我看不出哪里说明都是“导出”的意思,MSDN说的很清楚,一个导出,一个导入。一个介词用to 一个介词用from
0 请登录后投票
   发表时间:2011-08-04  
假如有工程:

libfoo/test.h
       test.c

use_libfoo/main.c


test.c引用了test.h同时又要提供一个导出函数给use_libfoo调用,所以这时在libfoo的工程里会增加-DBRIDGE3DWRAPPER 的编译选项,提示编译器要生成导出函数。

在use_libfoo的工程中不会去定义BRIDGE3DWRAPPER  ,同样main.c会include libfoo/test.h,这样就可以得到函数声明(声明这个函数是一个从dll引用的函数)了,这样就写一份代码两个工程使用。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics