【问题标题】:Using TR1 libraries in GCC and MSVC在 GCC 和 MSVC 中使用 TR1 库
【发布时间】:2011-08-22 14:17:58
【问题描述】:

我想使用现代版本的 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(memory)”之类的预处理器宏或类似的东西。

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

如果有任何建议,我将不胜感激!

【问题讨论】:

  • std::tr1::shared_ptr 适用于我的 MSVC10。
  • MF:谢谢。 TG:您能给出的最一般的答案将不胜感激!

标签: c++ visual-c++ gcc tr1


【解决方案1】:
  1. VC++ 2010 在 C++0x 模式下运行;以前的版本不支持 C++0x。也就是说,VC++ 2010 中的许多标准库仍然基于 TR1(例如,std::result_of&lt;&gt; 使用 TR1 result_of 协议而不是基于decltype);事实上,VC++ 2010 中的许多标准库实际上并未定义在命名空间 std 中,而是定义在命名空间 std::tr1 中,并使用 using 指令拉入命名空间 std
  2. 使用Boost.TR1 -- 它将根据您的平台#include 适当的标头,或者如果您的平台不支持TR1,#include 相应的Boost 实现并将它们拉入命名空间@ 987654330@ with using 声明。

【讨论】:

  • 谢谢!但是我被告知(购买 Windows 人员)“std::tr1::shared_ptr”不起作用;他们必须使用std::shared_ptr。我可能记错了吗?如果命名空间总是可以被视为“std::tr1”,那么这已经是问题的一半了。
  • @Kerrek SB:我不确定你在说什么;在 VC++ 2010 中,没有std::shared_ptr&lt;&gt; 的定义,只有std::tr1::shared_ptr&lt;&gt; 的定义,它使用 using 指令拉入命名空间std。所以,当然使用std::tr1::shared_ptr&lt;&gt; 是安全的。
  • 好吧,我不知道,因为我没有编译器。我想有人告诉我,为了让我的 GCC 代码正常工作,他们必须将 替换为 并将 std::tr1::shared_ptr 替换为 std::shared_ptr,但他们可能只是没有测试过 std: :tr1::shared_ptr。非常感谢您澄清这一点!
  • 带有 TR1 补丁的 Visual Studio 2008 需要命名空间中的 tr1。但是,IIRC,它是 GCC 需要在标头路径中使用 tr1,而带有 Tr1 补丁的 Visual Studio 2008 只是将新内容添加到旧标头中。
  • 我们正在使用 CMake。我现在正在玩 Boost.TR1。我使用 CMake 找到了 Boost,并将“-D BOOST_HAS_GCC_TR1”添加到 GCC 选项(并且没有更改 MSVC 选项),并将所有标头转换为 C++0x 样式( 等)。手指交叉。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的所有回答,以及有关 Boost.TR1 的提示!现在我该接受谁的回答?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    不同版本的 MSVC 各有特色。无法打开或关闭它们。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2020-08-13
      • 2021-08-12
      相关资源
      最近更新 更多