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

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

0 66

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. SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
    2. [LeetCode] Trapping Rain Water II 题解
    3. Console app 里的依赖注入及其实例生命周期
    4. 15个私有云上的DevOps 开源工具
    5. 【机器学习经典算法源码分析系列】-- 逻辑回归
    6. 广州APP开发外包公司哪家比较好?广州达到信息技术有限公司技术到底怎么样?
    7. OA办公自动化系统
    8. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)
    9. 扯一扯我的2016
    10. 【SysML】用例图

    衣食父母

    最近热帖

    1. 计算机程序的思维逻辑 (76) - 并发容器 - 各种队列 4
    2. 期待微软平台即服务技术Service Fabric 开源 8
    3. 使用Docker容器来源码编译etcd 9
    4. 深入理解Spring中bean的生命周期 7
    5. C++实现四叉树 7
    6. 关于计算机中时间的科普和八卦 7
    7. NIO(四、Selector) 9
    8. 使用cmd命令打开Python文件式程序方法 9
    9. Tcl与Design Compiler (六)——基本的时序路径约束 9
    10. 索引优先队列的工作原理与简易实现 8

    随机文章

    1. 非root Android设备上Tcpdump的实现
    2. for与break的用法
    3. Android活动的生命周期
    4. 学习Data Science/Deep Learning的一些材料
    5. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面