全部 android asp.net C/C++ cshap IOS Java javascript nodejs perl php python ruby web容器 其他 前端 数据库 第三方平台 混合式APP 网络 系统 默认分类

dll导出命名空间下的c风格函数陷阱

0 108

1、编译阶段,如果不是重载,那么C风格的同名函数与C++风格的同名函数,就会报编译错误。error C2084: function 'int Test(void)' already has a body。

2、编译期间,编译器会检查命名空间里的函数。如SG::Test();编译器会检测是否有函数Test()在SG命名空间里。如果没有就会报错。error C2039: 'Test' : is not a member of 'SG' 

3、链接阶段,当命名空间与extern “C”组合在一起时,生成的函数代码其实是C风格的,没有命名空间修饰。这是因为C风格里函数里没有命名空间这一概念,所以命名空间自动会被链接器忽略。

基于以上的原则,编译器链接器能够识别出基本所有的错误用法。但是有一种情况,编译器链接器都无法识别。那就是DLLA中有命名空间

 namespace SG1
 {
	extern "C" __declspec(dllexport) int Test();
 }

DLLB中有命名空间SG2::Test()导出函数。

  namespace SG2
 {
	extern "C" __declspec(dllexport) void Test();
 }

在EXE中调用SG2::Test()。 这个时候,编译链接都是正确的。 但是实际运行的时候,却隐藏着一个隐患。 因为实际生成的汇编代码直接是

004EF8FF FF 15 18 1A 78 00 call  dword ptr [__imp__Test (781A18h)] 

和命名空间无关。 那么汇编代码会调用SG1下的还是SG2下的Test呢? 这两个DLL谁先引用进到EXE,先调用谁。

热忱回答0

  • 加入年费大会员(20每年)
  • 热门标签

    猜你喜欢

    1. PPT素才搜索简谈
    2. 虚拟机下安装ubuntu系统
    3. 结巴分词2--基于前缀词典及动态规划实现分词
    4. Tarjan-求强连通分量
    5. 全年计划-2017
    6. MapReduce实现手机上网日志分析(分区)
    7. CSDN删除上传资源的办法
    8. 设计模式(一) 策略模式
    9. 代码的症与药
    10. 【2017-04-25】winform公共控件、菜单和工具栏、Tab和无边框窗体制作

    衣食父母

    最近热帖

    1. 不带插件 ,自己写js,实现批量上传文件及进度显示 5
    2. 连载《一个程序猿的生命周期》-《发展篇》 - 10.欠薪的高薪和稳定的相对低薪,你会选择哪个? 6
    3. android网页分享到朋友圈问题求助? 6
    4. vue实现标签云效果 6
    5. 如何在前端模版引擎开发中避免使用eval函数 6
    6. 从String类型字符串的比较到StringBuffer和StringBuilder 6
    7. php利用gd实现图片的边框 6
    8. 谈谈java中遍历Map的几种方法 7
    9. angular之$watch、$watchGroup、$watchCollection 7
    10. ASP.NET MVC5(五):身份验证、授权 7

    随机文章

    1. openstack i版搭建教程
    2. 计算机程序的思维逻辑 (51) - 剖析EnumSet
    3. 细说ASP.NET Core静态文件的缓存方式
    4. 一个操作系统的实现 笔记(一)Windows7下工作环境搭建
    5. 封装一个简单的隔行换色