【问题标题】:C++ <complex> and <complex.h> in the same fileC++ <complex> 和 <complex.h> 在同一个文件中
【发布时间】:2014-05-01 18:41:57
【问题描述】:

我有一个使用 c++ &lt;complex&gt; 标头和许多 std::complex&lt;double&gt; 对象的大型代码库。但现在我还想使用其他几个使用&lt;complex.h&gt; 的库(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&lt;double&gt; 翻译成_Complex,这在某种程度上也是未定义的。 [这在我使用 Apple LLVM 5.1 版的 macbook 上运行良好;这个编译器错误发生在我需要支持的集群上。]

我什至不知道这是从哪里来的;我的 gcc 安装中的所有包含文件都没有“_Complex”——尽管它们确实有“_ComplexT”。我该如何调试这种东西?

或者更有帮助的是,我该如何解决这个编译器错误,而不仅仅是gccs 的一小部分?

【问题讨论】:

  • 您是否尝试过同时包含&lt;complex&gt;&lt;ccomplex&gt; 而不是&lt;complex.h&gt;
  • gcc 4.8.2 没有问题。此外,您通常不需要 extern "C"{} 包装标准库头文件,因为这些头文件通常是为在 C 或 C++ 下工作而编写的,但请检查您的特定头文件以确保。
  • _Complex是C中的关键字,部分类型如float _Complex
  • g++ 4.8.1 没有给出错误。 g++ 4.7.3 显示您引用的相同错误。似乎从 g++ 4.8 开始,当还包含 &lt;complex&gt; 时,它们不再使用 #define complex _Complex(如果不包含它,它们仍然会这样做)
  • 刚刚比较了 g++ 4.7.3 和 4.8.1 的 &lt;complex&gt;:他们添加了 #undef complex 和评论 // Get rid of a macro possibly defined in &lt;complex.h&gt; 我想这可以解释它;)

标签: c++ gcc


【解决方案1】:

在 C 中,_Complex 是用于声明复数的关键字:float _Complex。但是,他们#define complex _Complex 所以你可以写float complex 看起来更好。

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

所以如果你在 C++ 中使用&lt;complex&gt;,你应该去掉这个宏:

#include <complex.h>
#undef complex

这实际上是 g++ 从 4.8 开始在同一个翻译单元中支持 &lt;complex&gt;&lt;complex.h&gt; 所做的事情。

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

【讨论】:

  • 嗯。这适用于我的 MWE,好吧,但在我的真实代码中,我得到 error: no match for call to ‘(std::complex&lt;double&gt;) (double, double)’。也许我的 MWE 太 M...
  • 好吧,通过重新排序我的包含并删除任何名为 I 的变量,这一切现在似乎都可以工作了......谢谢!
  • I 的问题与gcc.gnu.org/bugzilla/show_bug.cgi?id=59087 有关,正如您猜想的那样,最好在您的代码中简单地避免 I。
  • 啊,又解释了!非常感谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 2018-11-29
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多