【问题标题】:Usage of macros in std::string sourcestd::string 源代码中宏的使用
【发布时间】:2019-02-28 20:01:05
【问题描述】:

我正在编写一些使用 std::string 的 c++ 代码。
我想看看代码是怎么写的,所以我进入了源代码。 (ctrl + 左键单击)。
我注意到,到处都有宏。
代码甚至以:

结尾
_STD_END
// Corresponds to: #define _STD_END }

我明白为什么宏很有用,并且我将它们用于我自己的 Log.hpp 文件,但我不明白为什么有人会使用诸如 _STD_END 之类的宏而不是仅仅编写 }

澄清一下,我的问题是为什么 std::string 的作者 P.J. Plauger 决定以这种方式使用宏,如果我也应该这样做?

【问题讨论】:

  • 标准库的编写不是考虑到可读性。库实现者还必须遵守他们自己的一套规则,以避免与用户代码发生任何冲突,并有权根据他们正在工作的平台或编译器授予他们自己的权限,而您当然不想依赖这些平台或编译器。通过阅读标准库实现来学习并不是学习 c++ 的一种非常可靠的方法。
  • @Xerxes -- 如果我也应该这样做? -- 快速回答 -- 不。
  • 说得很清楚,如果你想了解标准库是做什么的,你应该read the documentation。作为一个普通的程序员,任何比它告诉你的更详细的事情都是你不应该担心的。除了基本的好奇心之外,您不需要深入研究标准库的实现,除非您确信该实现存在错误。
  • 虽然标准库不应该用作一种有趣的休闲阅读体验,但您可以学习一些非常简洁的、特定于平台的技巧,您可以把它们放在后口袋里,直到真正(更多真的在这里)需要它们。归根结底,更多的知识总是比更少的好。只是不要滥用这些知识。
  • 查看该头文件的版权日期:1992。原始 STL was not in a namespace。通过更改少量#defines,宏允许在“全局命名空间模式”或“std 命名空间模式”中使用相同的头文件。

标签: c++ string std


【解决方案1】:

这就是微软许可的 Dinkumware 库(尽管他们最近接管了对其版本的全面维护)。 _STD_BEGIN_STD_END 宏用于自定义 std 命名空间。一些编译器不(没有?)支持命名空间;对于那些编译器,宏扩展是空的。一些编译器需要一些间接性,并且这些宏扩展为指令,将代码放入特定于实现者的命名空间(即名称以下划线后跟大写字母开头的命名空间),它可能会或可能不会由 using 补充-指令将该命名空间的内容拉入std。在许多情况下,它们分别扩展为显而易见的普通namespace std {}

简而言之,它们是关于多平台库实现的可配置性。

我在 Dinkumware 工作了好几年,所以我有第一手的知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多