我有一个使用c ++ <complex>标头和许多std::complex<double>对象的大型代码库.但现在我也想使用其他几个使用的库(fftw和spinsfast)<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?
在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时,您也不会收到错误.
| 归档时间: |
|
| 查看次数: |
4793 次 |
| 最近记录: |