gpt4 book ai didi

c++ - 编译时如何检查TR1?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:40 25 4
gpt4 key购买 nike

我们正在编写一个将自身保存在 .hpp 文件中的日志记录库。我们想包括 <tr1/unordered_map> (如果编译器支持 TR1,)或标准 <map>除此以外。是否有一种在编译时检查 tr1 是否可用的标准方法?

我在想,与“__cplusplus”定义符号存在的方式相同,可能已经定义了“__cxx__tr1”或类似的东西。我没有在 TR1 的草稿中看到它,所以我假设它不存在,但我想先问一下以防万一。

请注意,如果这些定义不存在,将它们本身包含在提案中并不是一个坏主意。

最佳答案

如果您正在使用任何配置工具,例如 autotools,您可以尝试编写如下测试:

AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])

然后在您的代码中使用这些定义。

一般来说 __cplusplus 宏应该给你标准的版本号,但是没有编译器可以给你 100% 标准的实现...所以写配置宏。

不幸的是,这只是检查此类事情的非常可靠的方法,除非您想为每个编译器编写 1001 #ifdef(boost 的作用)

然后:

#include "config.h"
#ifdef HAVE_CXX0X
# include <unordered_map>
typedef std::unordered_map<foo,bar> my_map;
#elif HAVE_TR1
# include <tr1/unordered_map>
typedef std::tr1::unordered_map<foo,bar> my_map;
#else
# include <map>
typedef std::map<foo,bar> my_map;
#endif

关于c++ - 编译时如何检查TR1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/724465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com