gpt4 book ai didi

c++ - MSVC (10.0/11.0) 的内联命名空间仿真

转载 作者:太空狗 更新时间:2023-10-29 20:06:31 25 4
gpt4 key购买 nike

有什么方法可以用 MSVC 模拟内联命名空间吗?

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

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

最佳答案

恐怕没有这种模拟的可能。微软似乎对符号版本控制很不感兴趣,尽管他们在编译器的每一个新版本上都破坏了标准库上的 ABI。 GCC 仿真之所以有效,是因为强大的使用是内联命名空间功能的基础。微软从来没有过类似的东西,所以你不能模拟内联命名空间。恐怕您暂时无法对 libc++ 进行版本控制。

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

基本上,你把

#pragma detect_mismatch("libcxx_version", "1.0")

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

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

编辑:忘记提及:此功能是 VS2010 中的新功能,但无论如何将 libc++ 移植到没有右值引用的编译器可能相当无望。

关于c++ - MSVC (10.0/11.0) 的内联命名空间仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com