C ++ <complex>和<complex.h>在同一个文件</complex.h> </complex>中

时间:2014-05-01 18:41:58

标签: c++ gcc

我有一个使用c ++ <complex>标头和许多std::complex<double>对象的大型代码库。但现在我还想使用其他使用<complex.h>的其他库(fftwspinsfast)。不幸的是,将这两种类型的复合物混合似乎与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的一小部分?

1 个答案:

答案 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时,您也不会收到错误。