我有一个使用c ++ <complex>
标头和许多std::complex<double>
对象的大型代码库。但现在我还想使用其他使用<complex.h>
的其他库(fftw
和spinsfast
)。不幸的是,将这两种类型的复合物混合似乎与gcc 4.6.1不相容(可能是其中之一)。
这是显示错误的最小工作示例:
// This is what I do for my various complex objects
#include <complex>
// This is one of many things FFTW/spinsfast essentially do
extern "C" {
#include <complex.h>
}
int main() {
std::complex<double>(1.0,2.0);
return 0;
}
当我编译时:
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:7:8: error: expected unqualified-id before ‘_Complex’
test.cpp:7:8: error: expected ‘;’ before ‘_Complex’
显然,gcc正在将std::complex<double>
翻译成_Complex
,这在某种程度上也是未定义的。 [这在我的macbook上工作正常,它使用Apple LLVM 5.1版;这个编译器错误发生在我需要支持的集群上。]
我甚至无法弄清楚这是从哪里来的;我的gcc安装中的所有包含文件都没有&#34; _Complex&#34; - 虽然他们确实有&#34; _ComplexT&#34;。我该如何调试这种东西?
或者更有帮助的是,如何解决此编译器错误的方式不仅仅适用于gcc
的一小部分?
答案 0 :(得分:7)
在C中,_Complex
是用于声明复数的关键字:float _Complex
。但是,他们#define complex _Complex
因此您可以编写看起来更好的float complex
。
当然,在您希望complex
以外的上下文中使用名称_Complex
时遇到问题,例如std::complex
,然后扩展为std::_Complex
因此,如果你在C ++中使用<complex>
,你应该摆脱这个宏:
#include <complex.h>
#undef complex
这实际上是g ++自4.8以来在同一翻译单元中同时支持<complex>
和<complex.h>
的行为。
请注意,启用C ++ 11时,您也不会收到错误。