调用C++;来自C库的应用程序代码? FALKS,假设我有一个C++应用程序/库运行,它实现了“< /P>” /* Alloc API */ void* my_alloc(int size) { return malloc(sizeof(size)); }

调用C++;来自C库的应用程序代码? FALKS,假设我有一个C++应用程序/库运行,它实现了“< /P>” /* Alloc API */ void* my_alloc(int size) { return malloc(sizeof(size)); },c,c++11,dynamic-library,C,C++11,Dynamic Library,这不在“外部c”项下 我有一个C动态库,我需要从中调用我的_alloc,我可以直接调用那个API吗 Like, int test_my_alloc (int size) { int *x; x = (int*)my_alloc(size); if (x == NULL) { return 0; } else { return 1; } } 您需要创建一个存根,例如 存根标题: // stub.h #ifdef __c

这不在“外部c”项下

我有一个C动态库,我需要从中调用我的_alloc,我可以直接调用那个API吗

Like,

int test_my_alloc (int size) {
    int *x;

    x = (int*)my_alloc(size);
    if (x == NULL) {
        return 0;
    } else {
        return 1;
    }
}

您需要创建一个存根,例如

存根标题:

// stub.h

#ifdef __cplusplus
extern "C" {
#endif

void* my_alloc_c(int size);

#ifdef __cplusplus
}
#endif
存根实现:

// stub.cpp

#include "stub.h"
#include "header_where_my_alloc_is_declared.h"

void* my_alloc_c(int size)
{
    return my_alloc(size);
}
您的C代码(示例):

然后编译存根并将其与C代码链接:

g++ -Wall -c stub.cpp          # compile stub.cpp
gcc -Wall my_code.c stub.o     # compile your C code and link with stub.o

您需要创建一个存根,例如

存根标题:

// stub.h

#ifdef __cplusplus
extern "C" {
#endif

void* my_alloc_c(int size);

#ifdef __cplusplus
}
#endif
存根实现:

// stub.cpp

#include "stub.h"
#include "header_where_my_alloc_is_declared.h"

void* my_alloc_c(int size)
{
    return my_alloc(size);
}
您的C代码(示例):

然后编译存根并将其与C代码链接:

g++ -Wall -c stub.cpp          # compile stub.cpp
gcc -Wall my_code.c stub.o     # compile your C code and link with stub.o
例如,您需要一个存根代码。此外,你最好确保你的C++函数不抛出(我猜C++函数,从C程序调用,代码<主代码<代码>,这就产生了一个不例外的例子)。顺便说一下,你应该确信,在C++中,<代码>静态< /COD> C++数据(如<代码> STD::CUT)之前,你的代码< >主< /C> >(因此,你最好把程序与C++编译器连接,而不是C程序)。见

<>实际中,至少在Linux上用C++编写的代码(<代码> g++<代码>)或通过(<代码> CLAN++/COD>),C++函数有一些。 您可能会使用一些丑陋的、不可移植的技巧,通过其损坏的名称来调用函数。你可以大胆地编码:

 int main(int argc, char**argv) {
   extern void* _Z10my_alloc_ci(int size);
   void * p = _Z10my_alloc_ci(42);
   return 0;
 }
但我有点不好意思给出这样愚蠢的建议。你甚至可以使用例如

但是,我觉得你不应该有任何这样的方法,我很惊讶为什么你需要调用一个没有被包围在C++代码中的C++函数。 <>注意,理论上,C++函数(没有<代码>外)C“< /代码>”甚至可以有不同于C函数的不兼容。我不知道有什么实现能做到这一点。为了安全起见,你应该用C++代码包来包装你的C++函数,使用<代码>外部“C”< /C> > /P>

为了避免未被允许的异常,您可能会在C++包装中捕获它们:

#include <cstdio>
#include <cstdlib>
extern "C" void* my_alloc_c(int size)  {
  extern void* my_alloc(int);
  try {
    return my_alloc(size);
  } catch (...) {
     ::fprintf(::stderr, "got uncaught C++ exception for my_alloc(%d)\n", 
          size);
    ::fflush(nullptr);
    ::abort();
  }
 }
#包括
#包括
外部“C”无效*我的所有(内部大小){
外部无效*my_alloc(int);
试一试{
返回我的分配(大小);
}捕获(…){
::fPrtFF(::STDRR),得到MyoAlLoc(%d)\n的未被允许的C++异常,
尺寸);
::fflush(nullptr);
::中止();
}
}

BTW,如果你的C++库很大,你可能会尝试自动生成胶水代码。例如,您可以通过在Loice中编码扩展来使用(LISPY域特定语言来扩展GCC),这将在编译C++头文件时生成胶粘代码。 您可能会感兴趣的是,哪个函数使您能够(可移植地)调用任意签名的任何(C,可能是C++)函数。

因为您需要存根代码。此外,你最好确保你的C++函数不抛出(我猜C++函数,从C程序调用,代码<主代码<代码>,这就产生了一个不例外的例子)。顺便说一下,你应该确信,在C++中,<代码>静态< /COD> C++数据(如<代码> STD::CUT)之前,你的代码< >主< /C> >(因此,你最好把程序与C++编译器连接,而不是C程序)。见

<>实际中,至少在Linux上用C++编写的代码(<代码> g++<代码>)或通过(<代码> CLAN++/COD>),C++函数有一些。 您可能会使用一些丑陋的、不可移植的技巧,通过其损坏的名称来调用函数。你可以大胆地编码:

 int main(int argc, char**argv) {
   extern void* _Z10my_alloc_ci(int size);
   void * p = _Z10my_alloc_ci(42);
   return 0;
 }
但我有点不好意思给出这样愚蠢的建议。你甚至可以使用例如

但是,我觉得你不应该有任何这样的方法,我很惊讶为什么你需要调用一个没有被包围在C++代码中的C++函数。 <>注意,理论上,C++函数(没有<代码>外)C“< /代码>”甚至可以有不同于C函数的不兼容。我不知道有什么实现能做到这一点。为了安全起见,你应该用C++代码包来包装你的C++函数,使用<代码>外部“C”< /C> > /P>

为了避免未被允许的异常,您可能会在C++包装中捕获它们:

#include <cstdio>
#include <cstdlib>
extern "C" void* my_alloc_c(int size)  {
  extern void* my_alloc(int);
  try {
    return my_alloc(size);
  } catch (...) {
     ::fprintf(::stderr, "got uncaught C++ exception for my_alloc(%d)\n", 
          size);
    ::fflush(nullptr);
    ::abort();
  }
 }
#包括
#包括
外部“C”无效*我的所有(内部大小){
外部无效*my_alloc(int);
试一试{
返回我的分配(大小);
}捕获(…){
::fPrtFF(::STDRR),得到MyoAlLoc(%d)\n的未被允许的C++异常,
尺寸);
::fflush(nullptr);
::中止();
}
}

BTW,如果你的C++库很大,你可能会尝试自动生成胶水代码。例如,您可以通过在Loice中编码扩展来使用(LISPY域特定语言来扩展GCC),这将在编译C++头文件时生成胶粘代码。 您可能会感兴趣的是,哪一个使您能够(可移植地)调用任意签名的任何(C,可能是C++)函数。

根据我收集的信息:

你有一个C++库,你不能控制(你不能添加外部)C“”/LI> <>你有一个C库,必须调用C++库
  • 您可以修改C库以适应解决方案(您可以更改makefile并更改要调用的函数的名称)
  • 这样,一个替代的解决方案是编译你的C库,与C++ C++库中使用的C++编译器非常相似,如果你可以接受的话。 注意:使用C89,您可能需要修改代码的位(例如,在C++中,void*到T*的转换不再是隐式的),但这可能比100+包装更容易

    注2:如果你使用了一些C99特征(例如VLAS),那么代码不会在C++中编译。

    < P>从我收集到的:

    你有一个C++库,你不能控制(你不能添加外部)C“”/LI> <>你有一个C库,必须调用C++库
  • 您可以修改C库以适应解决方案(您可以更改makefile并更改要调用的函数的名称)
  • 因此,另一种解决方案是编译您的C li