2017-07-27 7 views
0

最近、マクロを使用して生成されるコードが多いプロジェクトで作業しています。私は、生成されたコードが非常に少ないような状況に出くわしました。しかし、この現在のものでは、#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; 
}; 

私の質問は、すでにこのようなことを定義している特定の方法があるかどうかです。

ハッシュ定義は、自由に使用できます。 しかし、そのようなコードを作成するために、そのようなコードを書くための定義されたパターンや方法がありますか?このシナリオだけでなく、このようなコードは、クラス、イベント、構造などの自動生成に使用され、使用される他の多くのシナリオがあります。

プログラマーとして、私たちの努力を楽にするようなマクロを書く方法を考える。それは練習によってもたらされますが、具体的な方法やパターン や、私たちがこのようにプログラムするのに役立つドキュメントがあれば、私はそのようなマクロを使ってプログラミングすることを考えています。

どのような指針や提案が大きな助けになるでしょう。

+0

C++の場合、これを提供するブーストがあります。あなたが本当にCのそれに興味があるなら、私のパッケージP99を見ることができます。 –

+0

この特定のケースではマクロを使用してコードを汚染しています:-(プログラムはそれ以外の方が良いでしょう)他のケースではマクロを使用するのには良い理由があります – Serge

答えて

0

これは私の考えであり、簡単な返答には収まらない:-)。 C++、特にc11以降では、制御可能なコンパイラベースのジェネレータでマクロを置き換える多くの機能が追加されました。テンプレートで始まり、constexprで終わります。これはマクロよりはるかに強力なメカニズムですが、通常、意図を表現するためにはより多くのテキストが必要です。とにかく、この理由のために、cと比較して、マルクロスの必要性が大幅に減少します。実際には、C言語でそれらを使用する3つの良い理由があります。

  1. 言語の実装固有の詳細が隠されています。 gcc内の関数または構造体の属性。他のコンパイラでは実装されていないか、または別の方法で実装されている可能性があります。あなたが何かに変換する必要があり、特に機能にうまくフィットしない繰り返しのコードの比較的大きな塊を、交換、​​
  2. 便利なマクロ:#define PACKED __attribute((packed))__
  3. ヘッダファイルでガードマクロのように、さまざまな理由で条件付きコンパイルを使用して文字列。すなわち#define tostr(A) case A: return #A;
+0

あなたの答えはありがたいです。しかし、そのようなマクロを使用していますが、特定のパターンや、コーディングのこのコーディングスタイルを学び、他の場所に適用するのに役立つマクロの明確なコーディングや使用ガイドがあります。私はこのようなマクロをどのような状況で使用するべきかを知りたいと思っていましたし、同じマクロを使用するための具体的なパターンがあります。 – TechTotie

+0

アドバイスは:**絶対的に**必要がない限りマクロを使用しないでくださいもっと良いガイドラインがあるかどうかはわかりません:-)。おそらく、組織固有のガイドラインはいくつかありますが、業界全体ではありません。私は誰もが多かれ少なかれマクロの大文字の名前に同意する唯一のものだと思う。残りは個人的です。 – Serge

+0

あなたの入力をありがとうございました。 – TechTotie