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)
但有点失败的目的......
我担心没有这种模仿的可能性.微软似乎对符号版本控制非常不感兴趣,即使它们在其编译器的每个新版本上打破了标准库上的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的编译器可能无论如何都是无望的.
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |