2016-08-06 22 views
-2

私は現在、C++の詳細については、オープンソースのC++プロジェクトを検討しています。 は、私はプロジェクトの一つは、に位置しています見てください:C++プリプロセッサはどのように機能しますか?

https://github.com/Myzilla-Web-Resources/OpenBlox/

私はソースのほとんどを理解し、私は理解していない何かが、彼はC++クラスを宣言するためにプリプロセッサを使用している方法です。例えば

static_init.h

#define DECLARE_STATIC_INIT(ClassName) \ 
static void static_init_func(); \ 
static OpenBlox::static_init_helper ClassName##_static_init_helper 

namespace OpenBlox{ 
class static_init_helper{ 
    public: 
     static_init_helper(init_func_type f){ 
      static_init::instance().add_init_func(f); 
     } 
}; 

Instance.h

#define DECLARE_CLASS(Class_Name) \ 
    virtual Instance* cloneImpl(); \ 
    virtual QString getClassName(); \ 
    virtual int wrap_lua(lua_State* L); \ 
    DECLARE_STATIC_INIT(Class_Name); \ 
    protected: \ 
     static QString ClassName; \ 
     static QString LuaClassName 

Frame.h

namespace ob_instance{ 
class Frame: public GuiObject{ 
    public: 
     Frame(); 
     virtual ~Frame(); 

     virtual void render(); 

     DECLARE_CLASS(Frame); 
}; 
} 
#endif 

Frame.hはすべてを継承していることに注意してくださいInstance.h関数/ proce ssors。 誰かが私にこの作品の仕組みを説明できますか?

+3

コードでわからないことはありますか? 「この作品はどのように」は非常に幅広いです。 – HolyBlackCat

+0

広範には申し訳ありません。私は彼がどのようにプロセッサを使ってクラスを宣言しているのか分かりません。たとえば、DECLARE_CLASS(Frame)を呼び出すときには、クラスオブジェクト "Frame"をベクターや何らかの配列に追加する必要があります。だから後でクラスを実際に作成せずに宣言することもできます。または私はあまりにも難しいと思いますか? – Kurieita

+3

プリプロセッサは、コピー貼り付けと置換テキストベースで動作します。これ以上考えることはありません。 – DeiDei

答えて

1

プリプロセッサはテキストだけが

namespace ob_instance{ 
class Frame: public GuiObject{ 
    public: 
     Frame(); 
     virtual ~Frame(); 

     virtual void render(); 

     virtual Instance* cloneImpl(); 
     virtual QString getClassName(); 
     virtual int wrap_lua(lua_State* L); 
     DECLARE_STATIC_INIT(Frame); 
    protected: 
     static QString ClassName; 
     static QString LuaClassName; 
}; 
} 

になって、あなたが示したFrame定義で、プリプロセッサは最初DECLARE_CLASS(Frame)を見て、DECLARE_CLASSマクロの内容に置き換えて、検索と置換である(私はクリーンアップ書式設定、実際は置換テキスト全体が1行にあります)。

それから、ちょうどそれが挿入されたテキストの前に、再びを通じて読み取りを開始し、DECLARE_STATIC_INIT(Frame)を見ていることを置き換えるためにバックアップします:

namespace ob_instance{ 
class Frame: public GuiObject{ 
    public: 
     Frame(); 
     virtual ~Frame(); 

     virtual void render(); 

     virtual Instance* cloneImpl(); 
     virtual QString getClassName(); 
     virtual int wrap_lua(lua_State* L); 
     static void static_init_func(); 
     static OpenBlox::static_init_helper Frame_static_init_helper; 
    protected: 
     static QString ClassName; 
     static QString LuaClassName; 
}; 
} 

##token concatenation operatorある)

はあなたに最終的に与えますFrameクラス定義。

コメントでChris Beckに言及されているように、コンパイルする代わりにgccまたはclangに-Eフラグを付けると、コンパイル時に前処理されたファイルを出力することができます。

関連する問題