• C与C++之间相互调用


    http://www.cnblogs.com/luxiaoxun/p/3405374.html

    1、导出C函数以用于C或C++的项目

    如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。

    以下代码演示可由 C 和 C++ 客户端应用程序使用的头文件:

    复制代码
    // MyCFuncs.h
    #ifdef __cplusplus
    extern "C" {  // only need to export C interface if
                  // used by C++ source code
    #endif
    
    __declspec( dllimport ) void MyCFunc();
    __declspec( dllimport ) void AnotherCFunc();
    
    #ifdef __cplusplus
    }
    #endif
    复制代码

    MyCFunc()和AnotherCFunc()为C语言DLL的导出函数。

    如果需要将C函数链接到C++可执行文件,并且函数声明头文件没有使用上面的技术,则在C++源文件中添加下列内容以防止编译器修饰C函数名:

    extern "C" 
    {
    #include "MyCHeader.h"
    }

    该代码告诉编译器"MyCHeader.h"是C写的,不要修饰头文件中的C函数名,否则连接的时候会找不到。

    2、导出 C++ 函数以用于C语言项目

    如果在用C++编写的DLL中有希望从C语言模块访问的函数,应使用C链接而不是C++链接来声明这些函数。除非另外指定,C++编译器使用C++类型安全命名约定(也称作名称修饰)和C++调用约定(使用此调用约定从C调用会很困难)。

    若要指定 C 链接,请在DLL中为函数声明指定 extern "C"。例如:

    extern "C" __declspec( dllexport ) int MyFunc(long parm1);

    在C语言的函数中是无法直接调用C++代码的,如果要调用,可以做一个wrapper,例如call_Lib_CPPFunction,它的声明和实现如下:

    复制代码
    // wrapper function
    extern "C" void call_Lib_CPPFunction(Lib* p, DataAttribute* dataAttribute) 
    {
        p->daFun(dataAttribute);
    } 
    
    // daFun才是我们C++代码的实现
    void Lib::daFun(DataAttribute* dataAttribute)
    {
        map<string, MMSINFO>::iterator it;
        // ...
    }
    复制代码
  • 相关阅读:
    Java8 Stream Function
    PLINQ (C#/.Net 4.5.1) vs Stream (JDK/Java 8) Performance
    罗素 尊重 《事实》
    小品 《研发的一天》
    Java8 λ表达式 stream group by max then Option then PlainObject
    这人好像一条狗啊。什么是共识?
    TOGAF TheOpenGroup引领开发厂商中立的开放技术标准和认证
    OpenMP vs. MPI
    BPMN2 online draw tools 在线作图工具
    DecisionCamp 2019, Decision Manager, AI, and the Future
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7133027.html
Copyright © 2020-2023  润新知