【问题标题】:Is the _HAVE_BOOST macro a built-in in C++? Where does it come from?_HAVE_BOOST 宏是 C++ 内置的吗?它从何而来?
【发布时间】:2014-05-19 15:22:04
【问题描述】:

我正在阅读一段似乎可以选择使用 C++ Boost 库的代码。如下:

#ifdef _HAVE_BOOST
#include <boost/random.hpp>
#endif

稍后在代码中,有几个语句依赖于这个“_HAVE_BOOST”。如果正确导入了 C++ 库,我认为 _HAVE_BOOST 只是一个设置为 true 的标志。

“_HAVE_BOOST”标志是 C++ ifdef 语法的内置部分吗?也就是说,我尝试用谷歌搜索这个标志,但没有找到任何文档。此外,在文件的头部,没有#include&lt;boost&gt; 存在。整个文件中似乎不推荐使用此增强功能 - 如果添加了此 #include&lt;boost&gt;,是否会将 _HAVE_BOOST 设置为 true?

是否有一个列表或文档来描述与#ifdef 一起出现的各种大写字母?

【问题讨论】:

  • #ifdef 只是检查是否定义了符号。
  • 我将您的标题编辑为实际描述某事的标题。在搜索结果中找到这个问题的人会感谢我。
  • 什么时候定义_HAVE_BOOST?它是内置的吗?是什么导致它被定义?
  • 您可以在编译器命令行上定义符号(通常是-D)。在包含此文件之前,它可以在不同的文件中定义。

标签: c++ boost ifdefine


【解决方案1】:

我认为 _HAVE_BOOST 只是一个设置为 true 的标志...

#ifdef _HAVE_BOOST 不测试_HAVE_BOOST 是否为true;它测试是否定义了这样的preprocessor macro,无论值如何。

...如果正确导入了 C++ 库。

是的,考虑到上下文,这个特定的宏可能意味着表示 Boost 是否可用,因此是否可以依赖它。

是否有一个列表或文档来描述与#ifdef 一起出现的各种大写字母?

宏可以在头文件中使用#define 指令定义,也可以在编译命令中定义(例如,参见gcc 的-D 选项)。编译器也可以predefine 一些宏。

任何头文件都可以定义宏。您通常应该能够通过阅读文档来找到可以定义哪些宏,或者如果您没有文档,则可以通过阅读头文件本身来找到。

如果添加了此#include,_HAVE_BOOST 是否会设置为 true?

我发现它不太可能在&lt;boost&gt; 本身中定义。毕竟,在尝试包含 Boost 之后测试它是否可用是毫无意义的。

_HAVE_BOOST 何时定义?

您应该向编写代码的人询问。另一个需要思考的问题是,它是否已定义?如果不是,则 ifdef 之间的代码将被预处理器删除。

我的水晶球告诉我,它可能应该由构建过程的某种配置脚本定义。例如,autoconf 有一个宏,如果标头存在,它将定义一个预处理器宏 HAVE_header-file。注意开头没有下划线。

【讨论】:

  • 好,完整的答案
【解决方案2】:

这只是意味着如果你定义一个预处理器宏“_HAVE_BOOST”,编译器将包含 boost/random.hpp。像这样:

#define _HAVE_BOOST
#ifdef _HAVE_BOOST
#include <boost/random.hpp>
#endif

查看here 了解有关预处理器指令的更多详细信息。

【讨论】:

  • #define _HAVE_BOOST 在文件中不存在。这个标志是内置的吗?
【解决方案3】:

如果编译器支持c++11,它就会有&lt;random&gt;支持。

通过巧妙地使用间接包含和 typedef(或 using 语句?!),它可以在有或没有随机提升的情况下工作。

【讨论】:

  • 你没有回答我的问题。 _HAVE_BOOST 是内置在 C++ 中的宏吗?它之前没有在文件中定义。
  • 询问“_HAVE_BOOST [是] C++ 中内置的宏”是否就像询问希腊国定假日是否属于西班牙宪法一样。我认为您的问题主要是关于“稍后在代码中,有几个语句依赖于此”。很抱歉把这个问题解释得有点奇怪。在我的辩护中,这个问题也有点奇怪:)
猜你喜欢
  • 2023-01-07
  • 2023-03-27
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多