c++ - 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 complex
from<complex>
和#define complex _Complex
from<complex.h>
似乎在这个词上发生冲突complex
。
一种解决方案: 此解决方案仅在您可以修改其他库的标头时才有效。
由于关闭了这个问题的权力(尽管我认为这很好),这就是我所做的:
由于<complex.h>
has a#define complex _Complex
和<complex>
contains a class complex
,因此包含两个标题时会发生一些冲突。
我不得不在我的代码和其他库的头文件中将所有位置更改float complex*
为所有位置。float _Complex*
这消除了 cstyle <complex.h> 的定义和 c++ 风格的类复合体中单词的冲突,complex
而不会改变代码的作用。
解决方案
这种不兼容仅是语法,两种语言都保证它们的复杂类型具有与 a float[2]
(或double[2]
等)相同的布局。因此,您可以在两者之间进行调解,以获得cfloat
根据扩展语言定义的宏。类似的东西
#ifdef __cplusplus
typedef std::complex<float> cfloat;
#else
typedef float _Complex cfloat;
#endif
然后cfloat
在你所有的函数原型中使用它。
推荐阅读
- testing - 使用柏树重定向
- eclipse - 在 Windows 8.1 上的 Eclipse Oxygen 4.7 中安装 Google Cloud Tools Plugin 1.6.1 时出错
- android - 使用 Gradle 插件 3.1.2 改造 2.4.0
- xamarin - 如何在 xamarin 中将 .aar 文件转换为 .dll 时修复警告,因为它没有生成所有必需的类/接口
- python - 熊猫,合并 2 个数据框
- django - 仅当用户登录时从 Angular 发送 Post-requests 时禁止 Django 403
- android - 什么是 CTS 主机配置?
- xml - XQL 选择以下元素
- syntax - VS Code 将正确的 Flex Box 语法高亮显示为错误
- c - 打印垂直直方图