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

cmath syntax errors when building a C wrapper for a C++ library

本文关键字:cmath 语法 错误 C++ 构建 包装      更新时间:2023-10-16

现在我正在开发一个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.0VCincludecmath(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++类将被调用。我想知道这个问题是否有解决办法。谢谢

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

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

在标头中,您可以只包含C标头(即<math.h>而不是<cmath>),也可以在#ifdef __cplusplus下包含C++标头,但显然不能在C包装器部分中使用它们的内容。

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