代码之家  ›  专栏  ›  技术社区  ›  Liran

C和C++混合问题

c c++
  •  3
  • Liran  · 技术社区  · 15 年前

    我需要建立一个C++项目,将函数导出到C项目中 这是我的C++类:

    **mycpclass.h**

    class MyCppClass
    {
    public:
    static void MyCppMethod()
    }
    

    **mycppClass.cpp**

    void MyCppClass::MyCppMethod(){}
    

    *现在我需要为方法mycpmethod(static)创建一个接口。

    我做到了: **myexport.h**

    #define Export __declspec(dllexport)
    extern "C" void Export MyCppMethodWrapper();
    

    **mtexport.cpp**

    #include "MyCppClass.h"
    #include "MyExport.h"
    
    void MyCppMethodWrapper() { MyCppClass::MyCppMethod();}
    

    就是这样!

    现在C部分(不同的项目) 我将该项目与myexport.lib链接
    **程序

    #include "MyExport.h"        ->does not compile because of the extern "C"
    int main()
    {
      MyCppMethodWrapper();   
    
    }
    

    如果不添加行: #include "MyExport.h" 在program.c中,该程序编译并运行良好,但我需要为导出提供一个头部(客户机需要头部),我想让程序使用这个头部。我如何解决这个问题????

    谢谢你的回答

    4 回复  |  直到 12 年前
        1
  •  5
  •   brainiac    15 年前

    如果您希望这样做,那么可以很容易地有条件地定义extern:

    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C
    #endif
    

    然后:

    EXTERN_C Export MyCppMethodWrapper();
    
        2
  •  1
  •   user231967    15 年前

    通常你会反过来做,在C++程序中调用C函数,这是什么? extern "C" 是有益的。在这种情况下它对你没有帮助。

    你可以在DLL中找到静态方法的名称,写一些 extern ... 语句,然后调用静态方法。

    请注意,C++程序中的名称是错误的,即对象文件/库中的名称包含类A方法所属的信息及其参数类型。在Linux世界中,有一些工具可以对名称进行分类,但我不知道在MS Windows世界中有什么可用的,大概是什么。

    我的一般建议是,如果你必须这么做的话,再想想。

        3
  •  1
  •   PierreBdR    15 年前

    简短的回答是:你可以从C++中使用C,但不是反过来!

    如果你想从C中使用C++,你需要创建一个带有PrE C函数的瘦包装器(即 extern "C" { ... } 习惯于 只有在C++中编译 (显然,由于此语句在C中无效)并使用C中的函数。这应该看起来像:

    #ifdef __cplusplus // defined at least by G++, I don't know for other compilers
    extern "C" {
    #endif
    
    // ... function definitions here
    #ifdef __cplusplus
    }
    #endif
    
        4
  •  0
  •   iain    15 年前

    除了Brainic的答案,你还需要在program.c中使用dllimport。

    /* declare function directly */
    extern "C" void __declspec(dllimport) MyCppMethodWrapper();
    
    int main()
    {
      MyCppMethodWrapper();   
    
    }
    

    如果你想使用同一个标题,你需要使用Brainic的答案和一个额外的 #ifdef 对于 __declspec(dllexport)

    #ifdef MYDLL
    #define Export __declspec(dllexport)
    #else
    #define Export __declspec(dllimport)
    #endif
    
    EXTERN_C void Export MyCppMethodWrapper();
    

    然后将a/d mydll添加到dll项目的生成标志中。