有人知道为什么我的Visual Studio 2012 c++项目中__cplusplus
被定义为199711L
(这是“旧”的C++)吗?由于VS 2012现在支持C++ 11,它不应该说201103L
吗?即使我包括了C++ 11头文件,它仍然被错误地定义。有什么线索吗?
有人知道为什么我的Visual Studio 2012 c++项目中__cplusplus
被定义为199711L
(这是“旧”的C++)吗?由于VS 2012现在支持C++ 11,它不应该说201103L
吗?即使我包括了C++ 11头文件,它仍然被错误地定义。有什么线索吗?
这实际上取决于您期望宏实际意义是什么。201103L是否意味着“该编译器在编译器和库中完全支持C++11?” 是否应该意味着“该编译器支持某些合理的C++11子集?” 是否应该意味着“该编译器以某种方式支持至少一个C++11特性?”
每个实现何时提升版本号都由其自己决定。Visual Studio不同于Clang和GCC,因为它没有单独的C++03编译模式;它提供了一组特定的功能,这就是它所提供的。
通常,单个宏不是决定何时使用某个功能的有用工具。 Boost.Config 是一种更可靠的机制。标准委员会正在研究如何解决这个问题在未来的标准版本中。
/Zc:__cplusplus
)时才能实现。这是因为许多旧代码依赖于检测MSVC编译器的宏的旧值。
来源
希望未来一旦全球人民更新了他们的代码,微软将默认正确报告该宏。/Zc:__cplusplus
添加到项目命令行选项中)。如果您依赖于 __cplusplus
,请添加命令行开关。如果您仅在 Windows 上使用 Visual Studio,则 _MSVC_LANG
宏可能更合适,因为它基于所选的 C++ 标准进行更改。由于有解决方法,Microsoft 不太可能妥协。 - AlainD/Zc:__cplusplus
就是答案。假设您有一堆位于文件夹层次结构下的 .vcxproj
文件,只需将名为 Directory.Build.props
的文件放置到共同的父文件夹中,并填写如下内容:<?xml version="1.0" encoding="utf-8"?>
<Project>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalOptions>/Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
</Project>
#if defined(__cplusplus) && defined(_MSVC_LANG) && (__cplusplus == 199711L)
// Check against _MSVC_LANG with the value you expect for __cplusplus
#else
// Check against __cplusplus as usual
#endif
/Zc:__cplusplus
,就使用类似这样的东西。
make_unique
的库,因为它不需要时间。你还会知道 MS 正在开创标准化的几个方面,如 async/await 提案,并且他们也将其作为优先事项,以便我们拥有可工作的实现来完善我们的想法/提议。并不是说他们选择要实现什么,而是选择何时实现。 - Mark