代码之家  ›  专栏  ›  技术社区  ›  Diego Sevilla

编译时如何检查tr1?

  •  5
  • Diego Sevilla  · 技术社区  · 16 年前

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

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

    值得注意的是,如果这些定义不存在,那么将它们包含在提案本身中也不是一个坏主意。

    5 回复  |  直到 8 年前
        1
  •  2
  •   Artyom    16 年前

    如果您使用任何配置工具(如自动工具),您可以尝试编写如下测试:

    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
    
        2
  •  2
  •   greyfade    16 年前

    GCC-4.3有:

    #define __GXX_EXPERIMENTAL_CXX0X__ 1
    

    但是,这显然是不标准的。

        3
  •  2
  •   MSalters    16 年前

    参见ISOC++(WG21)纸 N1575 .此纸张已从TR1中删除,没有替换。所以没有官方的方法来检测TR1。

        4
  •  1
  •   C Pirate    16 年前

    我处理的一个库需要使用一些从Boost添加到tr1的类,如果可用的话,最好使用tr1。解决方案(作为基于Unix的库)是将检查推送到配置脚本中。

    所以换句话说,不,我所知道的任何便携设备。也就是说,如果您使用的是Unix,那么配置脚本检查就足够好用了。

        5
  •  0
  •   Mohamed Bana    14 年前

    假设一个使用的是VS2010,或者任何有TR1可用的套件,如果这样做会发生什么?

    #include "boost/tr1/unordered_map.hpp"
    ...
    std::tr1::unordered_map< ... > uMap;
    

    什么类型的 uMap 是吗?

    推荐文章