2

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

但是,我希望我正在编写的代码与我拥有的一些将图像存储在内存中的现有 C 代码兼容,这样我就可以更轻松地传递它,而无需不断地将图像写入磁盘。

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

foo.h

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

富.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 文件来了解模板文件。所以我愿意接受建议。预先感谢您的帮助

4

5 回答 5

4

这是可能的,但要小心。使用 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允许作为CC++ 使用:

#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"按照您的预期使用这些函数,只要您链接到库。

于 2013-04-12T22:17:29.287 回答
2

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

foo.h

/* 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 文件

于 2013-04-12T22:19:20.950 回答
2

C 中没有模板。这是 C++ 功能。对不起。

于 2013-04-12T22:10:46.793 回答
1

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

您已经使用 C++ 编译器对其进行了编译,否则您将无法编译重载的 foo 函数。

于 2013-04-12T22:15:36.313 回答
1

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

请记住,如果您将 C 用于其他内容,则需要将函数命名为不同的名称;C 不做函数重载。

于 2013-04-12T22:15:44.967 回答