首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义支持/不支持某个功能的HAS_XXX / NO_XXX

定义支持/不支持某个功能的HAS_XXX / NO_XXX
EN

Stack Overflow用户
提问于 2019-08-12 11:31:45
回答 2查看 73关注 0票数 0

为什么Boost C++11开发人员更喜欢NO_XXX而不是HAS_XXX?如您所见,\boost\core\noncopyable.hpp中使用了BOOST_NO_CXX11_DELETED_FUNCTIONS,

代码语言:javascript
复制
#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)
      noncopyable( const noncopyable& ) = delete;
      noncopyable& operator=( const noncopyable& ) = delete;
#else
  private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      noncopyable& operator=( const noncopyable& );
#endif

如果他们选择了BOOST_HAS_CXX11_DELETED_FUNCTIONS,情况就不会改变。

代码语言:javascript
复制
#if defined(BOOST_HAS_CXX11_DELETED_FUNCTIONS)
      noncopyable( const noncopyable& ) = delete;
      noncopyable& operator=( const noncopyable& ) = delete;
#else
  private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      noncopyable& operator=( const noncopyable& );
#endif

与使用HAS_XXX相比,使用NO_XXX是否具有优势?

EN

回答 2

Stack Overflow用户

发布于 2019-08-12 12:02:49

未定义的"has“意味着(a)您检测到该功能缺失,或(b)您忘记运行检测该功能是否缺失的代码。

然后编写依赖于/不依赖于特性的代码;构建在所有4种情况下都成功(特性存在/不存在,检测代码运行/不存在)。但在4种情况中的1种(功能存在,检测代码被跳过)编译了错误的代码。

未定义的"no“表示(a)您检测到该功能存在,或(b)您忘记运行检测该功能是否缺失的代码。

然后,您可以编写依赖于/不依赖于特性的代码。当您忘记运行功能检测代码,并且功能不存在时,构建将失败。

因此,NO减少了1个静默错误案例,并且静态检测程序逻辑错误的硬错误增加了1个。

看起来是个不错的计划。

票数 1
EN

Stack Overflow用户

发布于 2019-08-12 12:33:53

实际上有一些不同-不是在最终输出上,而是在默认设置上:

  • With HAS_XXX semantics,如果您想要某个功能,则需要显式启用该功能,默认值为已关闭的功能。
  • with NO_XXX semantics完全相反,默认值为on,但您可以显式禁用它(例如,因为您的编译器不支持它)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57455347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档