extern "C"        extern "C"使得在C++中使用C编译方式成为可能。在“C++”下定义“C”函数,需要加extern “C”关键词。用extern "C"来指明该函数使用C编译方式。输出的“C”函数可以从“C”代码里调用

使用微软专用的_declspec (dllexport)  
cpp文件在编译为OBJ文件时要对函数进行重新命名,C语言会把函数name重新命名为_name,而C++会重新命名为_name@@decoration,
extern "C"表示用C语言的格式将函数重命名
要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)
像如下代码
int main()
{
   func()
   return 0;
}
编译器生成像下面的代码
call func1
连接器传入像下面的代码
call 0x4000000         ; 函数func的地址
如果func在DLL中,连接器就无法得到func的直接地址;在32位系统下,连接器将生成一个thunk包含func的调用地址
0x40000000:    jmp DWORD PTR __imp_func
__imp_func事func在.exe导入函数表中的地址,这个地址传入连接器进行连接
这样生成的代码比较大而且速度慢;
而使用__declspec(dllimport) 则直接告诉连接器直接调用DLL中func的地址,不要使用thunk
  __declspec(dllimport) void func(void);
   void main(void) 
   {
       func1();
   }
生成如下代码
   call DWORD PTR __imp_fu

extern C _declspec(dllexport)浅析相关推荐

  1. Linux下GCC报:extern “C“ _declspec(dllexport)相关错误

    在使用GNU工具链时默认是导出函数,并且GCC里不认_declspec(dllexport) 使用条件宏分开: #ifdef WIN32 #define WEYE_UDP_PACKETS_EXTERN ...

  2. 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例

    在C++中,我们可以通过 __declspec(dllexport) 将函数导出为Dll中供其它程序使用,例如: _declspec(dllexport) int add(int a, int b); ...

  3. extern C __declspec(dllexport) __declspec(dllimport) 和 def

    前面的extern "C"  __declspec(dllexport)  __declspec(dllimport)都是用于函数或者变量,甚至类的声明的(可以把extern &q ...

  4. _declspec(dllexport)与_declspec(dllimport)

    __declspec(dllexport)2009-03-04 17:25 我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文 ...

  5. extern C __declspec(dllexport)

    一.__declspec(dllexport): 将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口. 通常它和extern    "C"   ...

  6. Windows API函数速查

    http://blog.csdn.net/ghevinn/article/details/8213614 Windows API函数速查 1. API之网络函数 WNetAddConnection 创 ...

  7. 浅析COM的思想及原理

    COM--Component Object Model,即组件对象模型,它是微软提出的一套开发软件的方法与规范.它也代表了一种软件开发思想,那就是面向组件编程的思想. 一.COM编程思想--面向组件编 ...

  8. Windows 动态链接库 DLL 浅析

    一.概念 DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据. 它是microsoft在windows操作系统中实现共享函数库概念的一种实现方 ...

  9. 学习编写测试桩之declspec (dllexport)篇

    动态库不能直接运行,也不能接受消息,他提供一些函数供执行他的程序或者动态库调用. windows API中的所有函数都包含在DLL中,其中有几个最为重要:Kernel32.dll,用户管理内存.进程和 ...

最新文章

  1. 2019年9月全国程序员工资统计。
  2. arm-linux-gcc/ld/objcopy/objdump参数总结【转】
  3. Windows 7下Eclipse搭建Android开发环境
  4. 【引用】Linux常用的日志文件解说及常用系统命令
  5. 尽量使用int型的列类型
  6. 一个基于ngrx的Angular图书搜索应用,带网络请求
  7. 该Tiled地图制作拿到项目~~这是偷懒,为了直接复制后写来
  8. 8086简单的指令流水线_在8086微处理器中执行流水线的指令和概念的步骤
  9. 大数据量表的优化查询
  10. 为避免攻击,研究员把严重的比特币漏洞详情焐了两年
  11. opencv基础---直方图均衡化(原理equalizeHist)
  12. zabbix详解(十四)——zabbix钉钉报警实战
  13. 06 Python爬虫之Re(正则表达式)库
  14. hibernate 基本步骤 一
  15. Java疯狂讲义第五章笔记
  16. python算法_02字符串(罗马类型的转换整数)
  17. 小程序用户协议页面实现
  18. 【接口调用】EasyCVR获取直播流接口调用过程
  19. 蛋白质组学研究的经典方法:双向电泳技术解读
  20. 3.6 Meterpreter 键盘记录

热门文章

  1. connection holder is null 异常
  2. STM32F103之实验7一阶互补滤波求解移动机器人的姿态代码
  3. 建立属于自己的腾讯云服务器
  4. 看埃洛普如何在诺基亚向微软效忠
  5. python numba教程_numba从入门到精通(1)—为什么numba能够加速
  6. Maya废墟场景搭建
  7. Ps使用技巧--(一)
  8. word中制表位的使用方法,用于编辑公式
  9. java解压.rar、.zip和.7z格式压缩包
  10. Python基础语法_Day03