私は現在、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。 誰かが私にこの作品の仕組みを説明できますか?
コードでわからないことはありますか? 「この作品はどのように」は非常に幅広いです。 – HolyBlackCat
広範には申し訳ありません。私は彼がどのようにプロセッサを使ってクラスを宣言しているのか分かりません。たとえば、DECLARE_CLASS(Frame)を呼び出すときには、クラスオブジェクト "Frame"をベクターや何らかの配列に追加する必要があります。だから後でクラスを実際に作成せずに宣言することもできます。または私はあまりにも難しいと思いますか? – Kurieita
プリプロセッサは、コピー貼り付けと置換テキストベースで動作します。これ以上考えることはありません。 – DeiDei