为C++库构建C包装器时出现cmath语法错误
cmath syntax errors when building a C wrapper for a C++ library
现在我正在开发一个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++类将被调用。我想知道这个问题是否有解决办法。谢谢
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++代码。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 更新到莫哈韦后出现cmath错误
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- cmath 是否借用了 math.h 的实现
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 为C++库构建C包装器时出现cmath语法错误