【发布时间】:2014-05-01 18:41:57
【问题描述】:
我有一个使用 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,这在某种程度上也是未定义的。 [这在我使用 Apple LLVM 5.1 版的 macbook 上运行良好;这个编译器错误发生在我需要支持的集群上。]
我什至不知道这是从哪里来的;我的 gcc 安装中的所有包含文件都没有“_Complex”——尽管它们确实有“_ComplexT”。我该如何调试这种东西?
或者更有帮助的是,我该如何解决这个编译器错误,而不仅仅是gccs 的一小部分?
【问题讨论】:
-
您是否尝试过同时包含
<complex>和<ccomplex>而不是<complex.h>? -
gcc 4.8.2 没有问题。此外,您通常不需要
extern "C"{}包装标准库头文件,因为这些头文件通常是为在 C 或 C++ 下工作而编写的,但请检查您的特定头文件以确保。 -
_Complex是C中的关键字,部分类型如float _Complex等 -
g++ 4.8.1 没有给出错误。 g++ 4.7.3 显示您引用的相同错误。似乎从 g++ 4.8 开始,当还包含
<complex>时,它们不再使用#define complex _Complex(如果不包含它,它们仍然会这样做) -
刚刚比较了 g++ 4.7.3 和 4.8.1 的
<complex>:他们添加了#undef complex和评论// Get rid of a macro possibly defined in <complex.h>我想这可以解释它;)