99.9%的C++程序使用宏。除非要创建基本文件,否则必须编写#include ,这是一个宏,用于粘贴文件中包含的文本。与文件的扩展无关紧要。宏非常强大,可以执行甚至模板, lambdas , constexpr ,内联或将来的任何编译器构造都无法做到的事情。
关于CPP编译器(通常是编译器)或语言,问题是它旨在限制事故。例如使用一种类型作为另一种类型,在使用对象之前不设置对象状态,不释放内存,使用垃圾值,在Java的情况下–访问超出范围的内存等。这一切都很好,实际上是错误容易抓到,但另一方面,它限制了程序员做有用的事情。
然后,语言创建者最终不得不设计出解决这些限制的方法。例如, Java具有用于连接C和C++ DLL的JNI库。
问题是Java没有宏。此外, Java是一种非常详尽的语言。
Java.util.something.member(.....
另一方面, C++可以将宏用于较短的名称。
#define BIT64 (8)
#define TYPE std::conditional::type
#define TRUE (std::is_same::value)
#define TRY_ENABLE std::enable_if::type
TRY_ENABLE func(){};
#undef // every definition
这些说明了宏的许多用法:
- 它可以将一个长声明变成一个短声明。
- 使用一个使语句具有含义的名称,它比后面的冗长代码更易于理解宏。
- 直截了当。不需要在名称空间中,也不需要使用声明来污染名称空间。
- 宏不会自行清理,但这很好,程序员可以决定何时需要宏并清理宏,以便另一个文件可以舒适地使用宏。使用永久存在的指令将其与CPP进行比较。
- 同样,由于宏源自C,因此您所看到的就是所得到的。什么你C.得到它!在C++中++表示下在双打。使用默认创建的ADL之类的构造函数,CPP有很多方法可以将您淘汰。另一方面,宏非常简单,但功能非常强大。
- 还要注意,数字8是如何变成一个已标识的名称的。 CPP的替代方法是const变量, constexpr函数。可能constexpr提供相同的结果,而没有运行时开销。但是声明一个const变量只是为了使代码更具可读性似乎浪费了内存。为什么分配内存只是为了给值命名?然后,当您将该变量传递给参数时,可能会产生另一项内存分配成本。使用宏仅产生一次分配成本。那就是将宏值传递给参数。
因此,宏不仅可以使名称更短,而且事实上的typedef和ref别名也可以用于使名称更短,而且宏还可以避免运行时开销。宏发生在运行时之前。宏一直避免在移动和模板等CPP功能之前花费大量时间。
想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。