在GCC和MSVC中使用TR1库

我想使用随现代版本的GCC和MSVC一起发布的TR1库,但有一些细微的差别:在GCC中,我不得不说

#include <tr1/memory>
std::tr1::shared_ptr<int> X;

而在MSVC我不得不说

#include <memory>
std::shared_ptr<int> X;

我有两个问题:1)MSVC是否自动在C ++ 0x模式下工作(相当于GCC的std = c ++ 0x),还是默认情况下工作在C ++ 98/03模式下? 2)我如何统一包含和命名空间? 我正在考虑一个类似“INCLUDE_TR1(内存)”或类似的预处理宏。

为了澄清,我想使用传统的标准C ++ 98/03; 不是C ++ 0x(否则不会有问题)。

我会非常感激任何建议!


  • VC ++ 2010只能在C ++ 0x模式下运行; 以前的版本没有C ++ 0x支持。 也就是说,VC ++ 2010中的大部分标准库仍然基于TR1(例如, std::result_of<>使用TR1 result_of协议,而不是基于decltype的); 事实上,VC ++ 2010中的大部分标准库实际上并没有在命名空间std定义,而是在名称空间std::tr1定义,并且使用using指令将其拉入命名空间std
  • 使用Boost.TR1 - 它将根据你的平台#include包括适当的头文件,或者如果你的平台没有TR1支持, #include包括相应的Boost实现,并使用声明将它们拖到命名空间std::tr1

  • VC ++ 2010 始终以C ++ 0x模式运行,但类存在于stdstd::tr1命名空间中。 您必须使用#if _MSC_VER来检测编译器以选择要包含的头(请参阅此答案)。

    Boost.TR1库可以自动包含您的编译器的头文件,并使用Boost来填充任何缺失的功能。 它可能有帮助。


    好的,在Boost.TR1出现几个不一致和不可克服的问题后,尤其是在尝试使用GCC的本地TR1库时,我决定完全抛弃Boost并使用一个小的#define解决方法。 这是我的“tr1.h”:

    #ifndef _TR1_INCLUDE_H
    #define _TR1_INCLUDE_H
    
    /** Usage: #include TR1INCLUDE(unordered_map)
     **
     ** Configuration: Define HAVE_TR1_SUBDIR if you need #include <tr1/unordered_map>; otherwise we take #include <unordered_map>.
     **
     **/
    
    #define QUOTE(arg) <arg>
    
    #ifdef HAVE_TR1_SUBDIR
    #  define TR1IFY(arg) tr1/arg
    #else
    #  define TR1IFY(arg) arg
    #endif
    
    #define TR1INCLUDE(arg) QUOTE(TR1IFY(arg))
    
    #endif
    

    现在我可以像这样编写我的程序:

    #include "tr1.h"
    #include TR1INCLUDE(unordered_map)
    
    链接地址: http://www.djcxy.com/p/86359.html

    上一篇: Using TR1 libraries in GCC and MSVC

    下一篇: What is "ANSI C++"?