有没有办法用MSVC模拟一个inline namespace?
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 {
}
}并在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__));
}现在我的问题是,我如何用MSVC实现同样的目标?如果这是不可能的,我会很高兴有一个解决方案,省略了版本控制(目前),我想这将是
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
#define _LIBCPP_END_NAMESPACE_STD }
#define _VSTD std但是有点违背了目的..。
发布于 2011-10-17 22:05:01
恐怕没有这种效仿的可能性。微软似乎对符号版本控制非常不感兴趣,即使他们在每一个新的编译器版本上都破坏了ABI的标准库。因为强使用是内联命名空间特性的基础,所以GCC仿真能够工作。微软从来没有类似的东西,所以你不能模拟内联名称空间。我担心你现在只能坚持不对libc++进行版本控制了。
微软的编译器中有一个功能可能会有所帮助。这是#杂注detect_mismatch:http://msdn.microsoft.com/en-us/library/ee956429.aspx
基本上,你把
#pragma detect_mismatch("libcxx_version", "1.0")放到一个中央libc++头文件中,并且包含该文件的每个模块都将在其中放置一个包含键和值的记录。当链接模块时,Microsoft链接器检查所有这样的记录对于任何给定的名称是否具有相同的值,如果存在不匹配,则会发出警告。
最终的结果是,您不能在单个程序中拥有多个并行版本的libc++,但至少您不会因为链接不兼容的对象文件而导致运行时的严重崩溃而导致无声的损坏。
编辑:忘了提一下:这个特性是VS2010中的新特性,但是将libc++移植到没有右值引用的编译器上可能是没有希望的。
https://stackoverflow.com/questions/7742563
复制相似问题