2

我在 C++ 项目中使用 octave 库。

#include <octave/oct.h>

刚才我添加了一个带有Thomas Beckerany_iterator实现的标题

#include "any_iterator.hpp"

我只是添加了标题,无法构建项目。出现了 20 多个错误和 50 多个警告。全部在八度头。例如:

/usr/include/octave/lo-mappers.h:52: 
error: expected unqualified-id before ‘(’ token

在代码中:

#if defined (HAVE_CMATH_ISNAN)
inline bool xisnan (double x)
{ return std::isnan (x); }         // line 52
#else

或者

/usr/include/octave/ov-base.h:580: 
error: expected ‘)’ before ‘void’

在声明中:

virtual octave_value isnan (void) const;

一旦我删除了标题,问题就消失了。同样在一个单独的项目中,any_iterator按预期工作。只是看起来他们不能共存。

有任何想法吗?我完全迷路了。any_iterator甚至受命名空间保护。

4

2 回答 2

6

当然可以!为什么不?它可以是任何东西,真的。举个例子——在标题中打开一个命名空间并忘记关闭它,然后在你的项目中包含这个标题,你就完成了。编译器将开始杜鹃并开始向您抛出错误,指向实际上与错误无关的不同位置。

于 2012-04-12T18:02:44.810 回答
3

是的。但如何是一个更困难的问题。

我能想到的至少有两个选项可以帮助调试它。

  1. 在编译文件的命令行选项中添加 -E。这将导致预处理器运行并吐出带有所有附加标题和扩展所有宏的代码。然后,您可以尝试编译该预处理程序,并可以准确了解它为什么会阻塞。

  2. 尝试使用 clang 而不是 gcc 进行编译。Clang 更擅长提供可理解的错误消息。

放置“any_iterator.hpp”解决了问题的事实意味着 any_iterator 包含有问题的代码。它可能间接包括 cmath 并以某种方式引起问题。我敢打赌,如果你在 octave/oct.h 之上包含 cmath,它会以同样的方式中断。

于 2012-04-12T18:15:23.030 回答