相信大家在看源码的时候一定碰到过这个宏,它的用法
class Q_GUI_EXPORT QPainter
{
Q_DECLARE_PRIVATE(QPainter)
源码:
#define Q_DECLARE_PRIVATE(Class) \
inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \
inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \
friend class Class##Private;
一般是在类的私有部分然后用宏去包含这个类,这样的话就有一个d_ptr指针就指向了这个QPianter类,这个d_ptr指针就可以操作QPainter的成员变量以及成员函数了。
这个宏设计的初衷就是为了保持C++的二进制兼容性
二进制兼容性就是即使在更新或替换组件(如库或模块)后,现有程序的二进制形式仍然能够正常运行,而无需重新编译。
这通常是通过遵循一系列规则来实现的,比如不改变公共接口、添加私有成员等等之类的规则,你只要遵循这些规则,无论你添加代码,二进制文件不会改变,程序不用重新编译就能运行,但这里的不改变并不是绝对的不改变,而是肯定有一些小的改变。
主要就是方便!
相关好的博客:
https://developer.baidu.com/article/details/3308864
https://catcheroftime.github.io/blog/2019-10/qt-d%E6%8C%87%E9%92%88q%E6%8C%87%E9%92%88/