如何检查TR1在编译时?
-
05-09-2019 - |
题
我们正在编写日志库,保持自身在.HPP文件。我们希望包括<tr1/unordered_map>
(如果编译器支持TR1,)或标准<map>
否则。有没有在编译时检查,如果TR1可用与否的标准方式?
我想,以相同的方式,该“__cplusplus
”定义符号的存在,有可能已被定义的“__cxx__tr1
”或类似的东西。我还没有看到,在草稿TR1,所以我认为它不存在,但我想先问清楚,以防万一。
作为一个说明,如果不存在这些定义,它不会是一个坏主意,包括他们的建议本身。
解决方案
如果使用的是任何配置工具,如自动工具可能会尝试写入像一个测试:
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
每个编译器非常可靠的方法(做什么升压)
然后:
#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
其他提示
GCC-4.3具有:
#define __GXX_EXPERIMENTAL_CXX0X__ 1
但是,这显然是不标准。
请参阅ISO C ++(WG21)纸 N1575 。本文已经从TR1下降,没有更换。因此,有检测TR1没有正式的办法。
一个库我处理需要使用接到升压加入到TR1一些类,如果有喜欢TR1。将该溶液(作为一个基于Unix的库)是将检查推入配置脚本。
因此,换句话说,没有,没有什么便携式,我知道的。也就是说,如果你是在Unix,配置脚本检查工作不够好。
假设一个使用VS2010,或有TR1可用的,如果一个人做,会发生什么任何套件
#include "boost/tr1/unordered_map.hpp"
...
std::tr1::unordered_map< ... > uMap;
uMap
的会是什么类型是什么?
不隶属于 StackOverflow