首页 > 解决方案 > C++11 复杂* 到 C 浮点复数 *

问题描述

我有一组在 C++11 中使用的复杂浮点数:

std::complex<float> *cx;

我正在尝试使用一个较旧的库,它采用 C 风格的复杂浮点数:

float complex *cx;

当我尝试这个时:

std::complex<float> *cpp = new std::complex<float>[100];
complex float *c = reinterpret_cast<complex float*>(cpp);
c_process(c); // c_process(complex float *c)    [ c library function ]

我得到:

error: expected ';' before 'float'   
complex float *c = reinterpret_cast<complex float*>(cpp);
        ^

问题是 C 库的头文件包含#include <complex.h>,而我#include <complex>的 C++11 代码中有使用 std::complex 的代码。

class complexfrom<complex>#define complex _Complexfrom<complex.h>似乎在这个词上发生冲突complex

一种解决方案: 此解决方案仅在您可以修改其他库的标头时才有效。

由于关闭了这个问题的权力(尽管我认为这很好),这就是我所做的:

由于<complex.h>has a#define complex _Complex<complex>contains a class complex,因此包含两个标题时会发生一些冲突。

我不得不在我的代码和其他库的头文件中将所有位置更改float complex*为所有位置。float _Complex*这消除了 cstyle <complex.h> 的定义和 c++ 风格的类复合体中单词的冲突,complex而不会改变代码的作用。

标签: c++c

解决方案


这种不兼容仅是语法,两种语言都保证它们的复杂类型具有与 a float[2](或double[2]等)相同的布局。因此,您可以在两者之间进行调解,以获得cfloat根据扩展语言定义的宏。类似的东西

#ifdef __cplusplus
typedef std::complex<float> cfloat;
#else
typedef float _Complex cfloat;
#endif

然后cfloat在你所有的函数原型中使用它。


推荐阅读