C++11 复杂<浮点>* 到 C 浮点复杂*

标签 c++ c

我有一个在 C++11 中使用的复杂 float 组:

std::complex<float> *cx;

我正在尝试使用一个较旧的库,它接受 C 风格的复杂 float :

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 库的 header 包含 #include <complex.h> ,我有#include <complex>在我使用 std::complex 的 C++11 代码中。

class complex来自<complex>#define complex _Complex来自<complex.h>似乎与complex这个词发生冲突.

一个解决方案: 只有当您可以修改其他库的 header 时,此解决方案才有效。

由于这个问题的权力已经关闭(尽管我认为这是一个相当好的),这就是我所做的:

<complex.h>有一个#define complex _Complex<complex>包含 class complex ,包含两个 header 时存在一些冲突。

我必须更改所有float complex*float _Complex*我的代码和其他库的头文件中到处都是。这消除了单词 complex 上的冲突。来自 cstyle 的定义和 c++ 样式的类复杂,而不更改代码的功能。

最佳答案

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

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

然后在所有函数原型(prototype)中使用这个 cfloat

关于C++11 复杂<浮点>* 到 C 浮点复杂*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50955093/

相关文章:

c++ - 'auto a_class::f(...) -> T const' 在语法中是否有歧义?

c++ - SDL2不使用纹理绘制图像

c - 函数 basename 是否去掉路径末尾的\n?

c - C中使用函数将字符串转换为大写和小写

c - 如何将空格分隔的 float 从字符串中提取到 c 中的另一个数组中?

c - 使用未初始化的局部变量 'num'?

c++ - Qt 5.x 嵌入式调试 - 部署剥离的二进制文件?

c++ - 在 C++ 中为整数或 double 重置 std::cout 的属性

C++ 检查 float

c++ - 如何从原始 Ptr 增加共享 Ptr 的计数