【问题标题】:Is there a preprocessor directive for detecting C++11 Standard library?是否有用于检测 C++11 标准库的预处理器指令?
【发布时间】:2013-07-18 16:07:28
【问题描述】:

是否可以使用预处理器指令确定 C++ 标准库是否支持 C++11?

我目前正在开发一个使用 C++11 语言方言的项目,但使用的是不支持 C++11 的 C++ 标准库(我需要它才能与非 C++11 库链接)。

我知道我可以使用#if __cplusplus >= 201103L 测试 C++11 支持,但在我的情况下,这将评估为 true。我需要了解 C++ 标准库对 C++11 的支持。

【问题讨论】:

  • “我知道我可以使用 #if __cplusplus >= 201103L 测试 C++11 支持” - 不,甚至不是。鉴于大多数编译器仅支持 C++11 的一个子集(尽管该子集可能很大),这个 __cplusplus 宏完全没用。可移植地测试标准功能(无论是语言还是库)仍然是一个未解决的问题(尽管 尝试 正在解决它,正如 TemplateRex 在他的回答中指出的那样) .
  • 对我来说,您的问题听起来像是您需要像 CMake 或 autotools 这样的配置工具。他们会为您检查并生成一个包含您可以评估的宏的标题。如果您只有一个库,您可能会要求您的用户提供一个宏 - 这仍然是一个糟糕的解决方案。

标签: c++ c++11 c-preprocessor libc++


【解决方案1】:

我的问题是在 iOS 平台上,C++ 标准库的选择介于 libstd++ (GNU C++ standard library)libc++ (LLVM C++ standard library with C++11 support) 之间。我最终使用了_GLIBCXX_。完整的代码最终是:

#ifndef _GLIBCXX_
template <class T>
T&& move (T& arg) noexcept {
    return static_cast<T&&>(arg);
}
#endif

【讨论】:

  • 我假设您的意思是__GLIBCXX__,您的意思是ifdef 不是ifndef?您的测试假定 libstdc++ 从不支持 C++11,但事实并非如此,只有 Mac 附带的旧版本不支持 C++11。
  • ...一年后...实际上我最终使用了自己的手动预处理器定义,而不是依赖于标准库的自动检查。
【解决方案2】:

功能测试是标准委员会朝着下一个 C++14 标准(及更高标准)前进的一个积极研究方向。有一个第 10 研究组,它有自己的可免费访问的mailinglist,正在讨论当前的发展。对于下一次会议,此N3694 working paper 已提交。

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 2019-01-20
    • 2011-04-15
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多