为什么要在不需要的时候使用这么多宏呢?
Why use these many macros when it is really not needed
当我们查看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)
示例中的是关键。在您的源代码中,我希望看到宏的替代定义。根据编译环境的不同,一些结构可能需要不同的语法,或者根本不支持;因此,我们只编写一次代码,对这些结构使用宏,并根据所支持的内容安排适当地定义宏。
宏与变量:宏在这种情况下可以运行得更快,因为它们实际上是预处理后的常量。(对常量的操作要比对变量的操作快)。
宏与函数:与使用函数相比,使用宏可以避免开销,因为使用函数需要将参数压入堆栈,压入返回地址,然后从堆栈弹出....
宏:更快的执行,但需要更多的内存空间。
相关文章:
- 使用 assimp 加载模型 - 不需要提升?
- 是否可以使用另一个lua文件中定义的表,该表在当前文件中不需要作为模块
- 为什么在以下情况下不需要为依赖类型使用typename
- 使用带有诅咒库的 stdscr 创建窗口,在边框而不是线条中显示不需要的笑脸字符
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- 为什么我不需要在capnproto中使用AnyPointer::initAs?
- 使用 Struct 进行 mp3 播放器模拟C++(不需要播放 mp3 的唯一显示列表)
- 为什么在"cin"后使用 "getline" 时需要 cin.ignore(),而多次使用 "cin" 时不需要?
- 使用 C++ 的回文程序的不需要的输出
- C++使用sql连接器获取元数据,而不需要太多数据
- 在c++中使用cin.get()从输入流中丢弃不需要的字符
- 强制C++不需要的宏使用错误
- 为什么使用Switch语句的功能不需要返回
- 如果我们使用链表数组来实现哈希表,则可以以不需要遍历的方式实现"add"。这是真的还是假的?
- 在VS中编译C++,而不需要在运行时使用MSVCP120D.dll
- r语言 - 为什么当我使用 Rcpp 编写时,我不需要包含一些我应该以普通C++编写的库
- 什么样的语句不需要在C++中使用分号结尾?
- 为什么我不需要使用命名空间
- 如何在使用tesseract时禁用/排除不需要的操作
- 如何在vc++ 6.0项目中使用不需要.h和.lib文件的DLL