【问题标题】:How to check for TR1 while compiling?编译时如何检查 TR1?
【发布时间】:2009-04-07 07:19:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ dictionary unordered-map tr1


    【解决方案1】:

    如果您使用任何配置工具,例如 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
    

    【讨论】:

    • 好的,这是我想避免的选项,因为我只想发布一个 .hpp 文件并运行。对于这些“几乎标准”的东西,我更喜欢简单的比较,而不是必须运行完整的配置。
    • 我接受这个答案,因为似乎没有办法,这似乎是更好的方法......
    【解决方案2】:

    GCC-4.3 有:

    #define __GXX_EXPERIMENTAL_CXX0X__ 1
    

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

    【讨论】:

    • 如果您使用 g++ -std=c++0x 并且您在 std::unordered_map 中有 unordered_map,则定义此宏。否则(没有 -std=c++0x)你没有这个定义,但你仍然可以使用 包含和 std::tr1::unordered_map 类。
    • 是的,但正如其他人指出的那样,这只能在配置期间进行测试。给定 -std 开关时,4.3 之前的所有其他 GCC 版本都会引发错误。
    【解决方案3】:

    请参阅 ISO C++ (WG21) 论文 N1575。这篇论文已从 TR1 中删除,没有替换。所以没有官方检测TR1的方法。

    【讨论】:

      【解决方案4】:

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

      换句话说,不,据我所知,没有任何便携式设备。也就是说,如果您使用的是 Unix,则配置脚本检查工作得很好。

      【讨论】:

        【解决方案5】:

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

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

        uMap 的类型是什么?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-05
          • 1970-01-01
          • 2012-06-10
          • 1970-01-01
          • 1970-01-01
          • 2013-04-25
          • 2014-11-24
          相关资源
          最近更新 更多