-1

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

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

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

“_HAVE_BOOST”标志是 C++ ifdef 语法的内置部分吗?也就是说,我尝试用谷歌搜索这个标志,但没有找到任何文档。此外,在文件的开头,没有#include<boost>。看起来这个提升功能在整个文件中都被弃用了——如果#include<boost>添加了这个,_HAVE_BOOST 会被设置为 true 吗?

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

4

3 回答 3

3

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

#ifdef _HAVE_BOOST不测试是否_HAVE_BOOSTtrue;它测试是否完全定义了这样的预处理器宏,而不管值如何。

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

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

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

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

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

如果添加了这个#include,_HAVE_BOOST 会设置为 true 吗?

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

_HAVE_BOOST 何时定义?

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

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

于 2014-05-19T16:20:06.173 回答
1

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

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

在此处查看有关预处理器指令的更多详细信息。

于 2014-05-19T15:36:25.213 回答
0

如果编译器支持c++11,就会有<random>支持。

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

于 2014-05-19T15:35:50.613 回答