首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSVC的内联命名空间仿真(10.0/11.0)

MSVC的内联命名空间仿真(10.0/11.0)
EN

Stack Overflow用户
提问于 2011-10-12 23:30:02
回答 1查看 1.5K关注 0票数 3

有没有办法用MSVC模拟一个inline namespace

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

代码语言:javascript
复制
#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 {
  }
}

并在GCC上模拟如下所示:

代码语言:javascript
复制
#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__));
}

现在我的问题是,我如何用MSVC实现同样的目标?如果这是不可能的,我会很高兴有一个解决方案,省略了版本控制(目前),我想这将是

代码语言:javascript
复制
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
#define _LIBCPP_END_NAMESPACE_STD }
#define _VSTD std

但是有点违背了目的..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-17 22:05:01

恐怕没有这种效仿的可能性。微软似乎对符号版本控制非常不感兴趣,即使他们在每一个新的编译器版本上都破坏了ABI的标准库。因为强使用是内联命名空间特性的基础,所以GCC仿真能够工作。微软从来没有类似的东西,所以你不能模拟内联名称空间。我担心你现在只能坚持不对libc++进行版本控制了。

微软的编译器中有一个功能可能会有所帮助。这是#杂注detect_mismatch:http://msdn.microsoft.com/en-us/library/ee956429.aspx

基本上,你把

代码语言:javascript
复制
#pragma detect_mismatch("libcxx_version", "1.0")

放到一个中央libc++头文件中,并且包含该文件的每个模块都将在其中放置一个包含键和值的记录。当链接模块时,Microsoft链接器检查所有这样的记录对于任何给定的名称是否具有相同的值,如果存在不匹配,则会发出警告。

最终的结果是,您不能在单个程序中拥有多个并行版本的libc++,但至少您不会因为链接不兼容的对象文件而导致运行时的严重崩溃而导致无声的损坏。

编辑:忘了提一下:这个特性是VS2010中的新特性,但是将libc++移植到没有右值引用的编译器上可能是没有希望的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7742563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档