使用预处理器宏生成代码

时间:2017-07-27 13:35:44

标签: c++ class macros code-generation

最近,我正在一个项目中工作,该项目有很多使用宏生成的代码。我遇到过生成代码非常少的情况。但是在当前版本中,有很多代码是使用#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;
};

现在,我的问题是,是否有一种特定的方式已经定义了这些东西。

哈希定义可以用于自己的自由。 但是,是否有任何定义的模式或方法来编写这样的代码,这有助于我们生成这样的代码。不仅仅是这种情况。还有许多其他场景,可以编写这样的代码并用于自动生成类,事件,结构等。

作为一名程序员,如何考虑编写这样的宏&#39;这将减轻我们的努力。它确实来自实践,但有任何具体的方式或模式  或者任何帮助我们以这种方式编程的文档,我的意思是考虑使用这样的宏进行编程。

任何指示或建议都会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

这只是我的想法,不适合简单的回复:-)。 C ++,特别是c11及更高版本添加了许多功能,用一个可控制的基于编译器的生成器替换宏,从模板开始,以constexpr结尾。这是一个比宏更强大的机制,尽管它通常需要更多的文本来表达意图。无论如何,由于这个原因,与c相比,marcros的需求显着减少。我实际上看到了使用c ++

的3个充分理由
  1. 隐藏语言中特定于实现的详细信息。即gcc中的函数或结构属性,可能不在其他编译器中实现或以不同方式实现。 #define PACKED __attribute((packed))__
  2. 出于不同原因使用条件编译,例如头文件中的保护宏:#ifndef MY_HDR .. #define MY_HDR ... #endif
  3. 便利宏,替换相对较大的重复代码块,这些代码不适合函数,特别是当您需要将某些东西转换为字符串时。即#define tostr(A) case A: return #A;