锁定老帖子 主题:对细节的把握
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-26
是 thunk 不是 thrunk 吧 ... ?
这类宏不就是为了在用的地方和定义的地方用同一个标识符, 减少词汇污染么 ... |
|
返回顶楼 | |
发表时间: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上找到的。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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引用的函数)了,这样就写一份代码两个工程使用。 |
|
返回顶楼 | |