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。通过更改少量#defines,宏允许在“全局命名空间模式”或“std 命名空间模式”中使用相同的头文件。 【参考方案1】:

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

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

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

【讨论】:

以上是关于std::string 源代码中宏的使用的主要内容,如果未能解决你的问题,请参考以下文章

C中宏中需要括号[重复]

C++中宏替换与内联函数的区别

C++中怎样写宏定义

使用std :: string或char指针时,G ++编译的应用程序崩溃

为什么std :: string没有空指针?

嵌入式编程中宏值之间的比较是不是不好?