【问题标题】:Why use these many macros when it is really not needed为什么在真的不需要的时候使用这么多宏
【发布时间】:2013-01-02 12:48:24
【问题描述】:

当我们查看 STL 头文件时,我们看到使用了许多宏,我们可以直接编写单行或单个单词。我不明白为什么人们使用这么多宏。例如

 _STD_BEGIN

using ::type_info;

 _STD_END


 #if defined(__cplusplus)
  #define _STD_BEGIN    namespace std {
  #define _STD_END      }
  #define _STD  ::std::

【问题讨论】:

  • 我猜它们来自编译器不一定支持命名空间的时代。
  • 因为它是有条件定义的...

标签: c++ stl std


【解决方案1】:

图书馆提供者必须应对范围广泛的实施和用例。我可以看到在这种情况下使用宏的两个原因(可能还有其他我现在没有考虑的原因):

  • 需要支持不支持命名空间的编译器。我不确定这是否会成为最近的实现的一个问题,但它们中的大多数都有很长的历史并且即使不再支持不支持命名空间的编译器也会删除这些宏(不受保护的 using ::type_info; 暗示确实如此)的优先级较低。

  • 希望允许客户在不替换编译器提供商提供的标准库之外使用他们的标准库实现。然后配置库将允许用另一个名称替换 std

【讨论】:

    【解决方案2】:

    那个

    #if defined(__cplusplus)
    

    在您的示例中是关键。在您的源代码中,我希望看到宏的替代定义。根据编译环境,某些构造可能需要不同的语法或根本不支持;因此我们只编写一次代码,使用宏来构建此类结构,并根据支持的内容安排适当地定义宏。

    【讨论】:

      【解决方案3】:

      宏 vs 变量:在这种情况下,宏可以运行得更快,因为它们实际上是经过预处理后制成的常量。(对常量的操作比对变量的操作要快)。

      宏 vs 函数:与使用函数需要将参数压入堆栈、压入返回地址然后从堆栈中弹出相比,使用宏避免了开销......

      宏:执行速度更快,但需要更多内存空间。 功能:执行速度较慢,但​​内存空间较小。

      【讨论】:

      • 错了。变量 [sic] 当然会被声明为const,然后它就像文字一样是事实。头文件中定义的函数是inline(以避免ODR)。因此,在比较宏和函数时,您不能说函数有开销。同样,您也不能说函数占用的内存空间更少。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多