【问题标题】:Define HAS_XXX / NO_XXX for supporting / no-supporting a feature [closed]定义 HAS_XXX / NO_XXX 以支持/不支持功能[关闭]
【发布时间】:2019-08-12 03:31:45
【问题描述】:

为什么 Boost C++11 开发者更喜欢 NO_XXX 而不是 HAS_XXX?可以看到,BOOST_NO_CXX11_DELETED_FUNCTIONS用在\boost\core\noncopyable.hpp中,

#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,事情不会改变,

#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

使用 NO_XXX 是否比使用 HAS_XXX 更有优势?

【问题讨论】:

  • 你必须选择其中之一,而不是混合它们。自动工具(autoconf 等)使用HAS; Boost 可能选择了将自己与自动工具区分开来的替代方案。
  • 您可能需要询问命名为BOOST_NO_CXX11_DELETED_FUNCTIONS 的人。其他人所能做的就是推测和发表意见。 (我在 Boost 网站上找不到特别涵盖该名称的命名约定理由。)

标签: c++ c boost c-preprocessor


【解决方案1】:

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

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

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

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

所以NO 少了 1 个静默错误案例,并且多了 1 个静态检测程序逻辑错误的硬错误。

似乎是个不错的计划。

【讨论】:

    【解决方案2】:

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

    • 使用HAS_XXX 语义,您需要明确启用某个功能,如果您想拥有它,默认是关闭该功能。
    • NO_XXX 语义完全相反,默认开启,但您可以显式禁用它(例如,因为您的编译器不支持它)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-12
      • 2011-02-20
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多