MSVC的内联命名空间模拟(10.0/11.0)

rub*_*nvb 3 c++ namespaces visual-c++ c++11 inline-namespaces

有没有办法模拟inline namespaceMSVC?

LLVM的libc ++使用它来创建一个隐藏的版本化命名空间,如下所示:

#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
#define _LIBCPP_END_NAMESPACE_STD  } }
#define _VSTD std::_LIBCPP_NAMESPACE
namespace std {
  inline namespace _LIBCPP_NAMESPACE {
  }
}
Run Code Online (Sandbox Code Playgroud)

并在GCC上仿效它,如下所示:

#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { namespace _LIBCPP_NAMESPACE {
#define _LIBCPP_END_NAMESPACE_STD  } }
#define _VSTD std::_LIBCPP_NAMESPACE

namespace std {
namespace _LIBCPP_NAMESPACE {
}
using namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我如何用MSVC实现同样的目标?如果不可能的话,我会很高兴找到一个没有版本化的解决方案(现在),我想这将是

#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
#define _LIBCPP_END_NAMESPACE_STD }
#define _VSTD std
Run Code Online (Sandbox Code Playgroud)

但有点失败的目的......

Seb*_*edl 8

我担心没有这种模仿的可能性.微软似乎对符号版本控制非常不感兴趣,即使它们在其编译器的每个新版本上打破了标准库上的ABI.GCC仿真有效,因为强大的使用是内联命名空间功能的基础.Microsoft从未有类似的事情,因此您无法模拟内联命名空间.我担心你现在还没有对libc ++进行版本控制.

Microsoft的编译器中有一个功能可能有所帮助.这是#pragma detect_mismatch:http: //msdn.microsoft.com/en-us/library/ee956429.aspx

基本上,你把

#pragma detect_mismatch("libcxx_version", "1.0")
Run Code Online (Sandbox Code Playgroud)

到一个中央libc ++头文件,包含该文件的每个模块都会在其中放置一个包含键和值的记录.在链接模块时,Microsoft链接器会检查所有此类记录对于任何给定名称具有相同的值,并在出现不匹配时进行投诉.

最终结果是你不能在一个程序中拥有多个并行版本的libc ++,但至少你不会因为链接不兼容的目标文件而导致静默损坏,这些文件会在运行时导致令人讨厌的崩溃.

编辑:忘了提一下:这个功能在VS2010中是新的,但是将libc ++移植到没有rvalue refs的编译器可能无论如何都是无望的.