为什么要在不需要的时候使用这么多宏呢?

Why use these many macros when it is really not needed

本文关键字:候使用 不需要 为什么      更新时间:2023-10-16

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

 _STD_BEGIN
using ::type_info;
 _STD_END

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

库提供者必须处理各种各样的实现和用例。在这种情况下,我可以看到使用宏的两个原因(可能还有其他我现在没有考虑的原因):

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

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

#if defined(__cplusplus)
示例中的

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

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

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

宏:更快的执行,但需要更多的内存空间。