std::string 源代码中宏的使用
Posted
技术标签:
【中文标题】std::string 源代码中宏的使用【英文标题】:Usage of macros in std::string source 【发布时间】: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。通过更改少量#define
s,宏允许在“全局命名空间模式”或“std
命名空间模式”中使用相同的头文件。
【参考方案1】:
这就是微软许可的 Dinkumware 库(尽管他们最近接管了对其版本的全面维护)。 _STD_BEGIN
和 _STD_END
宏用于自定义 std
命名空间。一些编译器不(没有?)支持命名空间;对于那些编译器,宏扩展是空的。一些编译器需要一些间接性,并且这些宏扩展为指令,将代码放入特定于实现者的命名空间(即名称以下划线后跟大写字母开头的命名空间),它可能会或可能不会由 using 补充-指令将该命名空间的内容拉入std
。在许多情况下,它们分别扩展为显而易见的普通namespace std
和。
简而言之,它们是关于多平台库实现的可配置性。
我在 Dinkumware 工作了好几年,所以我有第一手的知识。
【讨论】:
以上是关于std::string 源代码中宏的使用的主要内容,如果未能解决你的问题,请参考以下文章