如何在普通 C 代码中包含 C++ 库和头文件

问题描述 投票:0回答:2

我试图在 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 gcc c++17 g++
2个回答
0
投票

我如何在(纯)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.


0
投票

我正在尝试在 C 代码中调用 C++ 库(关于 Bessel 函数)。

一般来说,你不能直接从C代码中调用C++标准库函数,除非它们也是C标准库函数。其他的通常根本不是 C 函数。

std::cyl_bessel_i()
特别是,由于重载,其本身不能用作 C 函数。

我不知道如何将

cmath
包含到
math.h
中。后者已经声明了标准数学库中的所有 C 函数。前者是后者的 C++ 版本,并添加了特定于 C++ 的内容。

在实践中,您可以通过弄清楚名称修改的详细信息并将 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.