最近、マクロを使用して生成されるコードが多いプロジェクトで作業しています。私は、生成されたコードが非常に少ないような状況に出くわしました。しかし、この現在のものでは、#definesなどを使用して生成されているコードがたくさんあります。 例:クラスのイベント生成および処理および生成クラスIdのクラスのようです。プリプロセッサマクロを使用したコード生成
#define INIT_EVENT_INFO(eventType) \
template <> const GenericClassID eventType::tClassID(#eventType) ;
#define DECLARE_EVENT(dType, evtType, destnType) \
typedef DUMMY_EVT_GEN<dType, std_event, custom_destn, destnType>::EventClass evtType;
template <typename ctData,
EventTypes evType,
DestnTypes evtDestType = standard_destn,
class DestnInterface = EmptyClass>
class DUMMY_EVT_GEN
{
private:
// alias for our current generator
typedef DUMMY_EVT_GEN<ctData,
evType,
evtDestType,
DestnInterface> Generator;
// Construct the first layer by adding the data part to our
// framework event base class.
//
typedef BaseEvent::DerivedEvent<Generator> CompleteEvent_;
/*
* Assemble an event destn type
*/
// Determine base class for event Destn: RTTIEventDestn for
// rtiDestns
typedef typename IF<isRtiDestn, BRTTIEventDestn, EventDestn>::type DestnBase_;
// create event Destn type
typedef typename IF<isCustomDestn, DestnInterface, BaseEvent::THBDestn<Generator> >::type DestnType_;
public:
/**
* A struct that contains all configuration options
*/
struct Config
{
/// base class for the Destn (rti or not)
typedef DestnBase_ DestnBaseClass;
/// class serving as data container for the event type
typedef ctData EventDataClass;
/// the resulting event type
typedef CompleteEvent_ EventClass;
/// the resulting Destn interface type
typedef DestnType_ DestnInterface;
};
// our final return values
typedef typename Config::EventClass EVT;
typedef typename Config::DestnInterface DestnInterface;
typedef typename Config::EventClass EventClass;
};
私の質問は、すでにこのようなことを定義している特定の方法があるかどうかです。
ハッシュ定義は、自由に使用できます。 しかし、そのようなコードを作成するために、そのようなコードを書くための定義されたパターンや方法がありますか?このシナリオだけでなく、このようなコードは、クラス、イベント、構造などの自動生成に使用され、使用される他の多くのシナリオがあります。
プログラマーとして、私たちの努力を楽にするようなマクロを書く方法を考える。それは練習によってもたらされますが、具体的な方法やパターン や、私たちがこのようにプログラムするのに役立つドキュメントがあれば、私はそのようなマクロを使ってプログラミングすることを考えています。
どのような指針や提案が大きな助けになるでしょう。
C++の場合、これを提供するブーストがあります。あなたが本当にCのそれに興味があるなら、私のパッケージP99を見ることができます。 –
この特定のケースではマクロを使用してコードを汚染しています:-(プログラムはそれ以外の方が良いでしょう)他のケースではマクロを使用するのには良い理由があります – Serge