构建C ++库的C包装时出现cmath语法错误

时间:2013-08-07 08:49:12

标签: c++ c visual-studio-2010

现在我正在开发一个C ++库,它希望有C接口。为了做到这一点,我有两个解决方案:

解决方案1:

lib_c_header.h
lib_c_header_imp.cpp

解决方案2:

lib_c_header.h
  lib_c_header_imp.c

然后我的第一个问题是:将C接口头和C ++实现文件作为C ++库的包装是否有效?

然后转到第二个解决方案,我将创建一个C接口头和C实现文件。在C实现文件中,将调用库中的C ++类。但是,当我这样做时,我总是遇到cmath语法错误:

c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cmath(19): error C2061: syntax error : identifier 'acosf'

这些错误导致我在cmath文件中输入以下代码:

_STD_BEGIN
using _CSTD acosf; using _CSTD asinf;
using _CSTD atanf; using _CSTD atan2f; using _CSTD ceilf;
using _CSTD cosf; using _CSTD coshf; using _CSTD expf;
using _CSTD fabsf; using _CSTD floorf; using _CSTD fmodf;
using _CSTD frexpf; using _CSTD ldexpf; using _CSTD logf;
using _CSTD log10f; using _CSTD modff; using _CSTD powf;
using _CSTD sinf; using _CSTD sinhf; using _CSTD sqrtf;
using _CSTD tanf; using _CSTD tanhf; 

我认为问题来自于实现文件lib_c_header_imp.c将被编译为C文件的事实,而在文件中将调用一些C ++类。我想知道是否有解决这个问题的方法。谢谢。

2 个答案:

答案 0 :(得分:3)

编写调用C ++的C函数的唯一方法是在extern "C"块中用C ++编译它。因为函数的主体仍然必须是C ++。所以你必须拥有lib_c_header_imp.cpp

您可以为C包装器和完整的C ++接口使用单独的标头,也可以将它们放在一个标头中,其中C ++部分由#ifdef __cplusplus保护。取决于它有多大以及最常用的等等。

在标题中,您可能只包含C标题(即<math.h>而不是<cmath>),或者您可能在#ifdef __cplusplus下包含C ++标题,但显然无法使用其内容在C包装器部分。

答案 1 :(得分:0)

通常,您可以在C ++中包含C,即在编译源时使用C ++编译器。但是,您不能使用C编译器来编译C ++代码。