_HAVE_BOOST宏是否内置于C ++中?它从何而来?

时间:2014-05-19 15:22:05

标签: c++ boost ifdefine

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

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

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

“_ HAVE_BOOST”标志是C ++ ifdef语法的内置部分吗?也就是说,我尝试使用Google搜索此标志,但没有找到任何文档。此外,在文件的头部,不存在#include<boost>。看起来整个文件中不推荐使用此提升功能 - 如果添加了#include<boost>,_HAVE_BOOST是否会设置为true?

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

3 个答案:

答案 0 :(得分:3)

  

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

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

  

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

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

  

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

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

任何头文件都可以定义宏。您通常可以通过阅读文档来查找可以定义的宏,或者如果您没有文档,则可以通过阅读头文件来找到它们。

  如果添加了#include,

会将_HAVE_BOOST设置为true吗?

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

  

_HAVE_BOOST何时定义?

您应该从编写代码的人那里询问。另一个值得思考的问题是,它是否已定义?如果不是,那么预处理器就会删除ifdef之间的代码。

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

答案 1 :(得分:1)

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

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

查看here以获取有关预处理程序指令的更多详细信息。

答案 2 :(得分:0)

如果编译器支持c ++ 11,它将支持<random>

通过巧妙地使用间接包含和typedef(或using语句?!),可以使用或不使用随机增强功能。