C++/Qtソースコード解読-予備編

4603 ワード

概要
Qtソースコードをコンパイルするのは、Qt内部の実装をよりよく追跡するためであり、フォローできるが必ずしも理解できるとは限らない.Qtソースコードには、マクロ定義の山のような不文律やルールがたくさんあるからだ.
Dポインタ
#define Q_D(Class) Class##Private * const d = d_func()
//##:                       ,         

Dポインタの意味をよく知ってから、逆に彼を再認識します!まず、ダイナミックライブラリのバイナリ互換性とは何かを見てみましょう.ダイナミックライブラリが更新されると、その呼び出し者も(コードを変更しない)再コンパイルしなければなりません.ダイナミックライブラリ(今回の変更)はソースコード互換性があると言えます.ライブラリの使用者が新しいライブラリを使用するために独自のプログラムを変更する必要がある場合、互換性はありません.ダイナミックライブラリ互換性は、非エクスポートに関係なく、ライブラリのエクスポートクラス/メソッドにのみ関係します.このハイライトコメントの文章を見てみると、新しいライブラリ(C/C++)のヘッダファイルの変動は呼び出し者に影響を与えるとは限らない-ヘッダファイルをエクスポートして変更がなければ、必ず互換性があり、変化があれば、より互換性がなく、互換性がある可能性がありますか?皆さんが議論しているのはC++ダイナミックライブラリの互換性の問題ですが、これはCライブラリがABIに自動的に合致しているからですか?(しばらくこの2つの疑問を残しておく!!)DポインタのQt上の応用と実現、博文は読者にQ_に対して十分ですDには全面的な理解があり、継承関係を重点的に見てみましょう.
class Q_CORE_EXPORT QObject
{
	...
    Q_PROPERTY(QString objectName READ objectName WRITE setObjectName)
    Q_DECLARE_PRIVATE(QObject)
    ...
    protected:
    QObject(QObjectPrivate &dd, QObject *parent = 0);

protected:
    QScopedPointer<QObjectData> d_ptr; 
    ...
}

#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;

Qポインタ
#define Q_Q(Class) Class * const q = q_func()

具体的なケース(QToolBox)はQToolBoxのヘッダファイルを通じてqtoolboxで使用できます.hでは、Q_DECLARE_PRIVATE()などのマクロはqglobalにジャンプする.hファイルで、Q_を表示Q Q_Dの定義Q_D(QToolBox); QToolPrivate * const d = d_func(); その後、後続のコードはd->...