从C访问c++模板

Accessing C++ templates from C

本文关键字:模板 c++ 访问      更新时间:2023-10-16

我使用OpenCV进行一些图像操作,它有几个函数必须给定数据类型才能正确执行。我的想法是模板化这些函数,这样我就不必为每种可能的数据类型编写单独的函数。

然而,代码我希望我写的代码与一些现有的C代码兼容,我有存储在内存中的图像,所以我可以更容易地传递它,而不需要不断地将图像写入光盘。

我遇到的问题是如何使我的。h文件和库让C程序调用c++模板函数。我还没有机会尝试它,但到目前为止,我所拥有的看起来像下面的东西:

foo。

int foo(int a, int, b);
float foo(float a, float b);

foo.c:

int foo(int a, int b) {
    return footemp(a, b);
}
float foo(float a, float b) {
   return footemp(a, b);
}

foo.hpp:

template<class t>
t footemp(t a, t b) {
   return a + b;
}

这不起作用,因为它需要我的。c文件知道模板文件。所以我愿意听取建议。提前感谢您的帮助

这是可能的,但要小心。使用c++源文件foo.cpp:

#include "foo.h"
#include "footemp.hpp"
int foo_int(int a, int b) {
    return footemp(a, b);
}
float foo_float(float a, float b) {
   return footemp(a, b);
}

foo.h中,使用extern "C"进行C兼容声明,使用#ifdef允许使用 C或c++:

#ifdef __cplusplus
extern "C" {
#endif
int foo_int(int a, int, b);
float foo_float(float a, float b);
#ifdef __cplusplus
}
#endif

将其编译为c++库-静态或动态,这无关紧要。在您的C源代码中,您现在可以按您的期望#include "foo.h"和使用这些函数,只要您链接到库。

我认为你可以做的一件事是用c++编写函数,声明你想要的特化,同时定义extern "C"函数来转发对模板函数的调用。

请记住,如果你用C来做其他的事情,你需要给函数起不同的名字;C语言不允许函数重载

正如mday299提到的,C语言中没有模板。然而,如果你的C代码包含在一个单独的编译单元(.exe/.dll)中,你可以为你的模板函数提供C接口,就像你做的那样:

foo。

/* C interface */
    int fooInt(int a, int, b);
    float fooFloat(float a, float b);

foo.hpp

template <class T> foo(T a,T b)
{
return a+b;
}

foo.cpp:

#include "foo.h"
#include "foo.hpp"
int fooInt(int a, int b) {
    return foo<int>(a, b);
}
float fooFloat(float a, float b) {
   return foo<float>(a, b);
}

然后,项目将使用c++单独编译,c部分将只看到foo.h和lib/dll文件

C中没有模板。这是c++的一个特性。对不起。

您很有可能使用c++编译器编译C文件。因此,您可以使用c++编译器构建整个项目,包括C和c++源。

你已经用c++编译器编译了它,否则你将无法编译你的重载foo函数