我正在阅读一段似乎可选择使用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一起出现的大写字母的种类?
答案 0 :(得分:3)
我认为_HAVE_BOOST只是一个设置为true的标志......
#ifdef _HAVE_BOOST
不测试_HAVE_BOOST
是true
;它测试是否定义了这样的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
语句?!),可以使用或不使用随机增强功能。