我试图在 C 代码中调用 C++ 库(关于 Bessel 函数)。但是,我不确定如何将
cmath
包含到 math.h
中。大多数示例都是关于如何将 C 代码包含到 C++ 中,但我正在尝试做相反的事情。这是似乎可以工作的 C++ 代码:
#include <cmath>
#include <iostream>
int main()
{
// spot check for nu == 0
const double x = 1.2345;
std::cout << "I_0(" << x << ") = " << std::cyl_bessel_i(0, x) << '\n';
// series expansion for I_0
double fct = 1;
double sum = 0;
for (int k = 0; k < 5; fct *= ++k)
{
sum += std::pow(x / 2, 2 * k) / std::pow(fct, 2);
std::cout << "sum = " << sum << '\n';
}
}
我如何在(纯)C 中做到这一点?
我如何在(纯)C 中做到这一点?
用C重新实现所有功能或复制或使用现有的C代码然后使用它们。
没有灵丹妙药。您必须编写 C 代码才能拥有 C 代码。
如何将 cmath 包含到 math.h 中
不可能将 cmath 包含在 math.h 中。
如何在普通 C 代码中包含 C++ 库和头文件
C 中不可能包含 C++ 头文件。
可以围绕 C++ 库编写一个 C 包装器,并将该 C 包装器头包含在 C 代码中。在这种情况下,
main()
函数必须用C++编译,使其不再是“普通”C。
在哪里可以找到进行计算的 C++ 代码(在 cmath 中)?
这取决于C++库的具体实现。 GNU libstdc++中的算法似乎在这里https://github.com/gcc-mirror/gcc/blob/f22a7ae8a96f7e5e330b12bd5045424619aa4926/libstdc%2B%2B-v3/include/tr1/modified_bessel_func.tcc#L269.
我正在尝试在 C 代码中调用 C++ 库(关于 Bessel 函数)。
一般来说,你不能直接从C代码中调用C++标准库函数,除非它们也是C标准库函数。其他的通常根本不是 C 函数。
std::cyl_bessel_i()
特别是,由于重载,其本身不能用作 C 函数。
我不知道如何将
包含到cmath
中。后者已经声明了标准数学库中的所有 C 函数。前者是后者的 C++ 版本,并添加了特定于 C++ 的内容。math.h
在实践中,您可以通过弄清楚名称修改的详细信息并将 C++ 标准库显式链接到您的 C 程序,使其适用于您的特定 C 和 C++ 实现。但更安全、更简单、更可移植的方法是编写一个带有 C 链接的瘦包装器。像这样的东西:
cyl_bessel_wrap.cpp
#include <cmath>
#include "cyl_bessel_wrap.h"
extern "C" double cyl_bessel_i(double nu, double x) {
return std::cyl_bessel_i(nu, x);
}
cyl_bessel_wrap.h
#ifdef __cplusplus
extern "C"
#endif
double cyl_bessel_i(double nu, double x);
你的main.c看起来像这样:
#include <math.h>
#include <stdio.h>
int main() {
// spot check for nu == 0
const double x = 1.2345;
printf("I_0(%d) = %d\n", x, cyl_bessel_i(0, x));
// series expansion for I_0
double fct = 1;
double sum = 0;
for (int k = 0; k < 5; fct *= ++k) {
sum += pow(x / 2, 2 * k) / (fct * fct);
printf("sum = %d\n", sum);
}
}