在GCC和MSVC中使用TR1文库

时间:2011-05-10 15:34:07

标签: c++ visual-c++ gcc 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(否则没有问题)。

我非常感谢任何建议!

4 个答案:

答案 0 :(得分:4)

  1. VC ++ 2010 以C ++ 0x模式运行;以前的版本没有C ++ 0x支持。也就是说,VC ++ 2010中的大部分标准库仍然基于TR1(例如std::result_of<>使用TR1 result_of协议而不是decltype - 基于);事实上,VC ++ 2010中的大部分标准库实际上并未在命名空间std中定义,而是在命名空间std::tr1中定义,并使用using指令拉入命名空间std
  2. 使用BoostTR1 - 根据您的平台,它将#include相应的标头,或者如果您的平台没有TR1支持,#include相应的使用声明来提升实现并将它们拉入命名空间std::tr1

答案 1 :(得分:4)

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

Boost.TR1库可以自动包含编译器的头文件,并使用Boost填写任何缺少的功能。这可能有所帮助。

答案 2 :(得分:2)

好吧,在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)

答案 3 :(得分:1)

不同版本的MSVC具有他们拥有的功能。没有办法打开或关闭它们。

其中一些可能同时具有某些功能的tr1和std版本。语义略有不同!