【发布时间】:2018-11-29 23:49:42
【问题描述】:
我在 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>,而我的 C++11 代码中有 #include <complex>,它使用 std::complex。
来自<complex> 的class complex 和来自<complex.h> 的#define complex _Complex 似乎在complex 这个词上发生冲突。
一种解决方案: 此解决方案仅在您可以修改其他库的标头时才有效。
由于权限关闭这个问题(虽然我认为这是一个很好的),这就是我所做的:
由于<complex.h> 有一个#define complex _Complex 并且<complex> 包含一个class complex,因此包含两个标头时会出现一些冲突。
我不得不在我的代码和其他库的头文件中将所有float complex* 更改为float _Complex*。这从 cstyle complex 的冲突,而不改变代码的作用。
【问题讨论】:
-
"我什么都试过了"——那么向我们展示你的尝试应该很容易。
-
本网站的规则明确规定我们不是作业网站。您应该在minimal reproducible example 中向我们展示您已经尝试做些什么来解决您的问题。发布您正在使用的两种类型的定义不满足该要求。此外,您的问题仍然不清楚:在这种情况下,“在它们之间移动”是什么意思?是什么阻止您使用基本函数将
std::complex<float>数组转换为_Complex数组? -
我已经澄清了我的问题 Xirema。还是想不通。
-
I punched your code into an online compiler,并收到一条不同的错误消息,与
complex关键字未映射到有效类型有关。用_Complex交换complex消除了编译错误。我不知道您使用的是哪个编译器,但您的编译器似乎不会像文档建议的那样将_Complex别名为complex。 -
您不必修改其他库的标题。您只需要做两件事:1.在包含所述库后立即添加
#undef complex(可能包含在#ifdef/#endif中)2.按照您所说的,将complex float替换为_Complex float你自己的 C++ 代码。