在 GCC 和 MSVC 中使用 TR1 库
Using TR1 libraries in GCC and MSVC
我想使用现代版本的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 实现,并使用 using 声明将它们拉入命名空间std::tr1
。
> VC++ 2010 始终在 C++0x 模式下运行,但类同时存在于 std
和 std::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)
不同版本的 MSVC 具有它们所具有的功能。无法打开或关闭它们。
其中一些可能还具有某些功能的 tr1 和 std 版本。语义略有不同!
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++ GCC/MinGW 路径:ssp、ext、tr1;并行,扩展,位,实验
- 在 GCC 和 MSVC 中使用 TR1 库