包括一个库是否会破坏C++中另一个库的功能

Can including one library break the functioning of another library in C++?

本文关键字:另一个 C++ 功能 是否 包括一      更新时间:2023-10-16

我正在C++项目中使用八度库。

#include <octave/oct.h>

刚才我添加了一个标题,其中包含托马斯贝克尔的any_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甚至受命名空间保护。

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

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

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

  1. 将 -E 添加到编译文件的命令行选项中。这将导致预处理器运行并吐出附加了所有标头和展开所有宏的代码。然后,您可以尝试编译该预处理,并可以确切地看到它为什么会窒息。

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

输入"any_iterator.hpp"解决了问题的事实意味着any_iterator包含有问题的代码。它可能间接包含 cmath 并以某种方式引起问题。我敢打赌,如果你包括高于八度/十月的cmath,它会以同样的方式中断。

相关文章: