1

我知道模板不是用 C 定义的。但是在我的例子中,我有一个用 C++ 编写的 API,它由用 C 编写的应用程序使用。我希望在 API 中添加一个模板函数。该函数在 abc.cpp 中定义如下:

template<typename T> T function_name(T param1){
  ...
  ...
  return val;
}

abc.hpp 中的声明如下:

template<typename T> T function_name(T);

这个函数是从 xyz.c 调用的:

int a ,b = 5;
a = function_name(b);

但是,它在 abc.cpp 和 abc.hpp 中都显示以下错误:

 error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘&lt;’ token
 template<typename T>

即使使用 extern "C" 也无济于事(导致错误:带有 C 链接的模板)。我的疑问是,是否可以以这种方式调用此模板函数?如果是,如何实现?谢谢你。

4

3 回答 3

9

不,当然不是,C 中不存在模板函数,您无法使用 C 编译器解析模板声明。

您将不得不在 C++ 端为int模板实例添加一个 C 包装器,然后调用它(例如,类似的东西function_int())。

于 2016-11-18T13:33:34.400 回答
1

由于您已经混合了 C 和 C++(因此必须处理可能的问题),另一个解决方案是继续使用 C++ 开发应用程序。这样,新代码可以使用 C++ 库的所有优秀特性,例如模板 ;-)、重载函数等,并且可以访问 C++ 的标准库,从而大大提高生产力。

我没有看到在应用程序中将 C++ 用于新源文件的主要障碍。在编辑时将现有的 C 文件切换到 C++ 是否容易和值得是另一个问题。

于 2016-11-18T13:48:24.657 回答
0

由于 C 不支持模板,您可以考虑使用 Type-Generic Functions - 一种定义泛型表达式的基于宏的方法。

如果不是这种情况,我建议继续使用 C++ 编译器。

于 2016-11-18T22:10:55.033 回答