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

Mik*_*ike 6 c++ gcc

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

当我编译:

> 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’
Run Code Online (Sandbox Code Playgroud)

很显然,gcc正在转化std::complex<double>_Complex,某种程度上也是未定义的.[这在我的macbook上工作正常,它使用Apple LLVM 5.1版; 这个编译器错误发生在我需要支持的集群上.]

我甚至无法弄清楚这是从哪里来的; 我的gcc安装中的所有包含文件都没有"_Complex" - 尽管它们确实有"_ComplexT".我该如何调试这种东西?

或者更有帮助的是,如何解决这个编译器错误的方式不仅仅适用于一小部分gccs?

lee*_*mes 7

在C中,_Complex是一个用于声明复数的关键字:float _Complex.但是,它们#define complex _Complex可以让你float complex看起来更好看.

当然,complex在您想要的位置之外的上下文中使用名称时会遇到麻烦_Complex,例如std::complex,然后扩展到std::_Complex.

因此,如果你<complex>在C++中使用,你应该摆脱这个宏:

#include <complex.h>
#undef complex
Run Code Online (Sandbox Code Playgroud)

这实际上是g ++自4.8以来所做的事情,以支持两者<complex><complex.h>同一翻译单元.

请注意,启用C++ 11时,您也不会收到错误.

  • "我"的问题与http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59087有关,正如您所猜测的那样,最好在代码中避免使用我. (2认同)